]> git.mxchange.org Git - fba.git/blob - fba/helpers/software.py
Continued:
[fba.git] / fba / helpers / software.py
1 # Fedi API Block - An aggregator for fetching blocking data from fediverse nodes
2 # Copyright (C) 2023 Free Software Foundation
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published
6 # by the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
16
17 import logging
18
19 from functools import lru_cache
20
21 from fba.helpers import tidyup
22
23 logging.basicConfig(level=logging.INFO)
24 logger = logging.getLogger(__name__)
25
26 # A list of relay software
27 relays = [
28     "activityrelay",
29     "aoderelay",
30     "selective-relay",
31     "pub-relay"
32 ]
33
34 # Aliases for mastodon
35 _mastodon_aliases = [
36     "hometown",
37     "ecko",
38     "fedibird",
39     "glitchcafe",
40     "kmyblue",
41     "nagitodon"
42 ]
43
44 # Aliases for misskey
45 _misskey_aliases = [
46     "slipfox calckey",
47     "calckey",
48     "groundpolis",
49     "foundkey",
50     "cherrypick",
51     "meisskey",
52     "magnetar",
53     "keybump",
54     "dolphin",
55     "calckey social",
56     "azk.sns",
57     "firefish",
58     "qtmmsky",
59     "iceshrimp",
60     "owohub",
61     "re+",
62     "russkey",
63     "loverskey",
64     "hajkey",
65     "sharkey",
66     "renekey",
67     "renekey-lite",
68     "yoiyami",
69     "catnip",
70     "cyberskey",
71     "catodon",
72     "lycheebridge",
73     "goblin",
74     "miraiskey",
75     "lovers",
76     "rosekey",
77     "hijikey",
78     "shrimpkey",
79     "tanukey",
80     "nexkey",
81     "meowkey",
82     "trashposs",
83     "cutiekey",
84     "kookie",
85     "barkle",
86 ]
87
88 # Aliases for pleroma
89 _pleroma_aliases = [
90     "akkoma",
91     "rebased",
92     "akkounfucked",
93     "ched",
94     "incestoma",
95     "revolver",
96     "menzoberranzan",
97     "moon-eyed"
98 ]
99
100 @lru_cache
101 def alias(software: str) -> str:
102     logger.debug("software='%s'- CALLED!", software)
103
104     if not isinstance(software, str) and software is not None:
105         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
106     elif software == "":
107         raise ValueError("Parameter 'software' is empty")
108     elif software.startswith("re:"):
109         logger.debug("Cutting prefix 're:' from software='%s' ...", software)
110         software = software.split(":")[1]
111
112     logger.debug("software='%s'- BEFORE!", software)
113     cleared = tidyup.domain(software)
114     logger.debug("cleared='%s'- AFTER!", cleared)
115
116     if cleared in _pleroma_aliases or "pleroma" in cleared:
117         logger.debug("Setting pleroma: cleared='%s'", cleared)
118         cleared = "pleroma"
119     elif "radiant" in cleared:
120         logger.debug("Setting radiant: cleared='%s'", cleared)
121         cleared = "radiant"
122     elif "mammuthus" in cleared:
123         logger.debug("Setting mammuthus: cleared='%s'", cleared)
124         cleared = "mammuthus"
125     elif "neodb" in cleared:
126         logger.debug("Setting neodb: cleared='%s'", cleared)
127         cleared = "neodb"
128     elif cleared in _mastodon_aliases or "되는 마스토돈" in cleared or "和歌" in cleared or "mastodon" in cleared:
129         logger.debug("Setting mastodon: cleared='%s'", cleared)
130         cleared = "mastodon"
131     elif cleared in _misskey_aliases or "shumihub" in cleared or "мисскей" in cleared or "milkey" in cleared or "misskey" in cleared:
132         logger.debug("Setting misskey: cleared='%s'", cleared)
133         cleared = "misskey"
134     elif cleared in ["runtube.re", "islameye"]:
135         logger.debug("Setting peertube: cleared='%s'", cleared)
136         cleared = "peertube"
137     elif cleared in ["nextcloud social", "nextcloudpi", "storage share", "nube"] or "nextcloud" in cleared:
138         logger.debug("Setting nextcloud: cleared='%s'", cleared)
139         cleared = "nextcloud"
140     elif "discourse" in cleared:
141         logger.debug("Setting discourse: cleared='%s'", cleared)
142         cleared = "discourse"
143     elif cleared == "activity-relay":
144         logger.debug("Setting activityrelay: cleared='%s'", cleared)
145         cleared = "activityrelay"
146     elif "owncast" in cleared:
147         logger.debug("Setting owncast: cleared='%s'", cleared)
148         cleared = "owncast"
149     elif cleared in ["streams-hubzilla-social", "streams13"]:
150         logger.debug("Setting streams: cleared='%s'", cleared)
151         cleared = "streams"
152     elif cleared == "roadhouse":
153         logger.debug("Setting hubzilla: cleared='%s'", cleared)
154         cleared = "hubzilla"
155     elif cleared == "takahē":
156         logger.debug("Setting takahe: cleared='%s'", cleared)
157         cleared = "takahe"
158     elif cleared == "diaspora* social network":
159         logger.debug("Setting diaspora: cleared='%s'", cleared)
160         cleared = "diaspora"
161     elif cleared == "tkz relay":
162         logger.debug("Setting aoderelay: cleared='%s'", cleared)
163         cleared = "aoderelay"
164     elif cleared == "gitdab":
165         logger.debug("Setting forgejo: cleared='%s'", cleared)
166         cleared = "forgejo"
167     elif cleared == "mbin":
168         logger.debug("Setting kbin: cleared='%s'", cleared)
169         cleared = "kbin"
170     elif cleared == "write.as":
171         logger.debug("Setting writefreely: cleared='%s'", cleared)
172         cleared = "writefreely"
173     elif "gnu social" in cleared:
174         logger.debug("Setting gnusocial: cleared='%s'", cleared)
175         cleared = "gnusocial"
176     elif cleared.find("/") > 0:
177         logger.warning("Spliting of slash: cleared='%s'", cleared)
178         cleared = cleared.split("/")[-1]
179     elif cleared.find("|") > 0:
180         logger.warning("Spliting of pipe: cleared='%s'", cleared)
181         cleared = cleared.split("|")[0]
182     elif "powered by" in cleared:
183         logger.debug("cleared='%s' has 'powered by' in it", cleared)
184         cleared = strip_powered_by(cleared)
185     elif cleared.endswith(" experimental"):
186         logger.debug("cleared='%s' ends with 'experimental", cleared)
187         cleared = strip_until(cleared, "experimental")
188
189     if isinstance(cleared, str) and " by " in cleared:
190         logger.debug("cleared='%s' has ' by ' in it", cleared)
191         cleared = strip_until(cleared, " by ")
192     elif isinstance(cleared, str) and " - " in cleared:
193         logger.debug("cleared='%s' has ' - ' in it", cleared)
194         cleared = strip_until(cleared, " - ")
195     elif isinstance(cleared, str) and " see " in cleared:
196         logger.debug("cleared='%s' has ' see ' in it", cleared)
197         cleared = strip_until(cleared, " see ")
198
199     logger.debug("cleared['%s']='%s'", type(cleared), cleared)
200     if cleared == "":
201         logger.warning("tidyup.domain() left no cleared name behind: cleared='%s'", cleared)
202         cleared = None
203     else:
204         logger.debug("cleared='%s' is being cleaned up further ...", cleared)
205         cleared = cleared.rstrip("!").strip()
206
207     logger.debug("cleared[%s]='%s' - EXIT!", type(cleared), cleared)
208     return cleared
209
210 @lru_cache
211 def strip_hosted_on(software: str) -> str:
212     logger.debug("software='%s' - CALLED!", software)
213
214     if not isinstance(software, str):
215         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
216     elif software == "":
217         raise ValueError("Parameter 'software' is empty")
218     elif "hosted on" not in software:
219         logger.warning("Cannot find 'hosted on' in software='%s'!", software)
220         return software
221
222     end = software.find("hosted on ")
223     logger.debug("end[%s]=%d", type(end), end)
224
225     software = software[0:end].strip()
226     logger.debug("software[%s]='%s'", type(software), software)
227
228     if " - " in software:
229         logger.debug("Stripping ' - ' of from software='%s' ...", software)
230         software = strip_until(software, " - ").strip()
231
232     logger.debug("software='%s' - EXIT!", software)
233     return software
234
235 @lru_cache
236 def strip_powered_by(software: str) -> str:
237     logger.debug("software='%s' - CALLED!", software)
238
239     if not isinstance(software, str):
240         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
241     elif software == "":
242         raise ValueError("Parameter 'software' is empty")
243     elif "powered by" not in software:
244         logger.warning("Cannot find 'powered by' in software='%s'!", software)
245         return software
246
247     start = software.find("powered by ")
248     logger.debug("start[%s]=%d", type(start), start)
249
250     software = software[start + 11:].strip()
251     logger.debug("software='%s'", software)
252
253     if " - " in software:
254         logger.debug("Stripping ' - ' of from software='%s' ...", software)
255         software = strip_until(software, " - ").strip()
256
257     logger.debug("software='%s' - EXIT!", software)
258     return software
259
260 @lru_cache
261 def strip_until(software: str, until: str) -> str:
262     logger.debug("software='%s',until='%s' - CALLED!", software, until)
263
264     if not isinstance(software, str):
265         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
266     elif software == "":
267         raise ValueError("Parameter 'software' is empty")
268     elif not isinstance(until, str):
269         raise ValueError(f"Parameter until[]='{type(until)}' is not of type 'str'")
270     elif until == "":
271         raise ValueError("Parameter 'until' is empty")
272     elif not until in software:
273         logger.warning("Cannot find until='%s' in software='%s'!", until, software)
274         return software
275
276     # Next, strip until part
277     end = software.strip().find(until)
278
279     logger.debug("end[%s]=%d", type(end), end)
280     if end > 0:
281         software = software[0:end].strip()
282
283     logger.debug("software='%s' - EXIT!", software)
284     return software
285
286 def is_relay(software: str) -> bool:
287     logger.debug("software='%s'- CALLED!", software)
288
289     if not isinstance(software, str):
290         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
291     elif software == "":
292         raise ValueError("Parameter 'software' is empty")
293
294     found = software in relays
295
296     logger.debug("found='%s' - EXIT!", found)
297     return found