]> 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 from fba.helpers import version
23
24 # A list of relay software
25 _relays = [
26     "activityrelay",
27     "aoderelay",
28     "selective-relay",
29     "pub-relay"
30 ]
31
32 # Aliases for mastodon
33 _mastodon_aliases = [
34     "hometown",
35     "ecko",
36     "fedibird",
37     "glitchcafe",
38     "kmyblue",
39     "nagitodon"
40 ]
41
42 # Aliases for misskey
43 _misskey_aliases = [
44     "slipfox calckey",
45     "calckey",
46     "groundpolis",
47     "foundkey",
48     "cherrypick",
49     "meisskey",
50     "magnetar",
51     "keybump",
52     "dolphin",
53     "calckey social",
54     "azk.sns",
55     "firefish",
56     "qtmmsky",
57     "iceshrimp",
58     "owohub",
59     "re+",
60     "russkey",
61     "loverskey",
62     "hajkey",
63     "sharkey",
64     "renekey",
65     "quollkey",
66     "renekey-lite",
67     "yoiyami",
68     "catnip",
69     "cyberskey",
70     "catodon",
71     "lycheebridge",
72     "goblin",
73     "miraiskey",
74     "lovers",
75     "rosekey",
76     "hijikey",
77     "shrimpkey",
78     "tanukey",
79     "nexkey",
80     "meowkey",
81     "trashposs",
82     "cutiekey",
83     "kookie",
84     "barkle",
85     "yojo-art",
86     "forkey",
87     "lockpick",
88     "pawkey",
89 ]
90
91 # Aliases for pleroma
92 _pleroma_aliases = [
93     "akkoma",
94     "rebased",
95     "akkounfucked",
96     "ched",
97     "incestoma",
98     "revolver",
99     "menzoberranzan",
100     "moon-eyed",
101     "puppyoma",
102     "cafkoma",
103 ]
104
105 logging.basicConfig(level=logging.INFO)
106 logger = logging.getLogger(__name__)
107 #logger.setLevel(logging.DEBUG)
108
109 @lru_cache
110 def alias(software: str) -> str:
111     logger.debug("software='%s'- CALLED!", software)
112
113     if not isinstance(software, str) and software is not None:
114         raise TypeError(f"software[]='{type(software)}' is not type 'str'")
115     elif software == "":
116         raise ValueError("Parameter 'software' is an empty string")
117     elif software.startswith("re:"):
118         logger.debug("Cutting prefix 're:' from software='%s' ...", software)
119         software = software.split(":")[1]
120
121     logger.debug("software='%s'- BEFORE!", software)
122     cleared = tidyup.domain(software)
123     logger.debug("cleared='%s'- AFTER!", cleared)
124
125     if cleared in _pleroma_aliases or "pleroma" in cleared:
126         logger.debug("Setting pleroma: cleared='%s'", cleared)
127         cleared = "pleroma"
128     elif "radiant" in cleared:
129         logger.debug("Setting radiant: cleared='%s'", cleared)
130         cleared = "radiant"
131     elif "mammuthus" in cleared:
132         logger.debug("Setting mammuthus: cleared='%s'", cleared)
133         cleared = "mammuthus"
134     elif "neodb" in cleared:
135         logger.debug("Setting neodb: cleared='%s'", cleared)
136         cleared = "neodb"
137     elif cleared in _mastodon_aliases or "되는 마스토돈" in cleared or "和歌" in cleared or "mastodon" in cleared:
138         logger.debug("Setting mastodon: cleared='%s'", cleared)
139         cleared = "mastodon"
140     elif cleared in _misskey_aliases or "shumihub" in cleared or "мисскей" in cleared or "milkey" in cleared or "misskey" in cleared:
141         logger.debug("Setting misskey: cleared='%s'", cleared)
142         cleared = "misskey"
143     elif cleared in ["runtube.re", "islameye"]:
144         logger.debug("Setting peertube: cleared='%s'", cleared)
145         cleared = "peertube"
146     elif cleared in ["nextcloud social", "nextcloudpi", "storage share", "nube"] or "nextcloud" in cleared:
147         logger.debug("Setting nextcloud: cleared='%s'", cleared)
148         cleared = "nextcloud"
149     elif "discourse" in cleared:
150         logger.debug("Setting discourse: cleared='%s'", cleared)
151         cleared = "discourse"
152     elif cleared == "activity-relay":
153         logger.debug("Setting activityrelay: cleared='%s'", cleared)
154         cleared = "activityrelay"
155     elif "owncast" in cleared:
156         logger.debug("Setting owncast: cleared='%s'", cleared)
157         cleared = "owncast"
158     elif cleared in ["streams-hubzilla-social", "streams13"]:
159         logger.debug("Setting streams: cleared='%s'", cleared)
160         cleared = "streams"
161     elif cleared == "roadhouse":
162         logger.debug("Setting hubzilla: cleared='%s'", cleared)
163         cleared = "hubzilla"
164     elif cleared == "takahē":
165         logger.debug("Setting takahe: cleared='%s'", cleared)
166         cleared = "takahe"
167     elif cleared == "diaspora* social network":
168         logger.debug("Setting diaspora: cleared='%s'", cleared)
169         cleared = "diaspora"
170     elif cleared == "tkz relay":
171         logger.debug("Setting aoderelay: cleared='%s'", cleared)
172         cleared = "aoderelay"
173     elif cleared == "gitdab":
174         logger.debug("Setting forgejo: cleared='%s'", cleared)
175         cleared = "forgejo"
176     elif cleared == "mbin":
177         logger.debug("Setting kbin: cleared='%s'", cleared)
178         cleared = "kbin"
179     elif cleared == "write.as":
180         logger.debug("Setting writefreely: cleared='%s'", cleared)
181         cleared = "writefreely"
182     elif "gnu social" in cleared:
183         logger.debug("Setting gnusocial: cleared='%s'", cleared)
184         cleared = "gnusocial"
185     elif "ed! thomas" in cleared:
186         logger.debug("Setting wordpress: cleared='%s'", cleared)
187         cleared = "wordpress"
188     elif cleared.find("/") > 0:
189         logger.warning("Spliting of slash: cleared='%s'", cleared)
190         cleared = cleared.split("/")[-1]
191     elif cleared.find("|") > 0:
192         logger.warning("Spliting of pipe: cleared='%s'", cleared)
193         cleared = cleared.split("|")[0]
194     elif "powered by" in cleared:
195         logger.debug("cleared='%s' has 'powered by' in it", cleared)
196         cleared = strip_powered_by(cleared)
197     elif cleared.endswith(" experimental"):
198         logger.debug("cleared='%s' ends with 'experimental", cleared)
199         cleared = strip_until(cleared, "experimental")
200
201     if isinstance(cleared, str) and " by " in cleared:
202         logger.debug("cleared='%s' has ' by ' in it", cleared)
203         cleared = strip_until(cleared, " by ")
204     elif isinstance(cleared, str) and " - " in cleared:
205         logger.debug("cleared='%s' has ' - ' in it", cleared)
206         cleared = strip_until(cleared, " - ")
207     elif isinstance(cleared, str) and " see " in cleared:
208         logger.debug("cleared='%s' has ' see ' in it", cleared)
209         cleared = strip_until(cleared, " see ")
210
211     logger.debug("cleared['%s']='%s'", type(cleared), cleared)
212     if cleared == "":
213         logger.warning("tidyup.domain() left no cleared name behind: cleared='%s'", cleared)
214         cleared = None
215     else:
216         logger.debug("cleared='%s' is being cleaned up further ...", cleared)
217         cleared = cleared.rstrip("!").strip()
218
219     logger.debug("cleared[%s]='%s' - EXIT!", type(cleared), cleared)
220     return cleared
221
222 @lru_cache
223 def strip_hosted_on(software: str) -> str:
224     logger.debug("software='%s' - CALLED!", software)
225
226     if not isinstance(software, str):
227         raise TypeError(f"Parameter software[]='{type(software)}' has not expected type 'str'")
228     elif software == "":
229         raise ValueError("Parameter 'software' is an empty string")
230     elif "hosted on" not in software:
231         logger.warning("Cannot find 'hosted on' in software='%s'!", software)
232         return software
233
234     end = software.find("hosted on ")
235     logger.debug("end[%s]=%d", type(end), end)
236
237     software = software[0:end].strip()
238     logger.debug("software[%s]='%s'", type(software), software)
239
240     if " - " in software:
241         logger.debug("Stripping ' - ' of from software='%s' ...", software)
242         software = strip_until(software, " - ").strip()
243
244     logger.debug("software='%s' - EXIT!", software)
245     return software
246
247 @lru_cache
248 def strip_powered_by(software: str) -> str:
249     logger.debug("software='%s' - CALLED!", software)
250
251     if not isinstance(software, str):
252         raise TypeError(f"Parameter software[]='{type(software)}' has not expected type 'str'")
253     elif software == "":
254         raise ValueError("Parameter 'software' is an empty string")
255     elif "powered by" not in software:
256         logger.warning("Cannot find 'powered by' in software='%s'!", software)
257         return software
258
259     start = software.find("powered by ")
260     logger.debug("start[%s]=%d", type(start), start)
261
262     software = software[start + 11:].strip()
263     logger.debug("software='%s'", software)
264
265     if " - " in software:
266         logger.debug("Stripping ' - ' of from software='%s' ...", software)
267         software = strip_until(software, " - ").strip()
268
269     logger.debug("software='%s' - EXIT!", software)
270     return software
271
272 @lru_cache
273 def strip_until(software: str, until: str) -> str:
274     logger.debug("software='%s',until='%s' - CALLED!", software, until)
275
276     if not isinstance(software, str):
277         raise TypeError(f"Parameter software[]='{type(software)}' has not expected type 'str'")
278     elif software == "":
279         raise ValueError("Parameter 'software' is an empty string")
280     elif not isinstance(until, str):
281         raise TypeError(f"Parameter until[]='{type(until)}' has not expected type 'str'")
282     elif until == "":
283         raise ValueError("Parameter 'until' is an empty string")
284     elif not until in software:
285         logger.warning("Cannot find until='%s' in software='%s'!", until, software)
286         return software
287
288     # Next, strip until part
289     end = software.strip().find(until)
290
291     logger.debug("end[%s]=%d", type(end), end)
292     if end > 0:
293         software = software[0:end].strip()
294
295     logger.debug("software='%s' - EXIT!", software)
296     return software
297
298 def is_relay(software: str) -> bool:
299     logger.debug("software='%s'- CALLED!", software)
300
301     if not isinstance(software, str):
302         raise TypeError(f"software[]='{type(software)}' is not type 'str'")
303     elif software == "":
304         raise ValueError("Parameter 'software' is an empty string")
305
306     found = software in _relays
307
308     logger.debug("found='%s' - EXIT!", found)
309     return found
310
311 @lru_cache
312 def remove_extras(software: str):
313     logger.debug("software[%s]='%s' - CALLED!", type(software), software)
314     if not isinstance(software, str):
315         raise TypeError(f"software[]='%s' is not type of 'str'", type(software))
316
317     if software == "":
318         logger.debug("Corrected empty string to None for software.")
319         software = None
320     elif ("." in software or " " in software):
321         logger.debug("software='%s' may contain a version number, removing it ...", software)
322         software = version.remove(software)
323
324     logger.debug("software[%s]='%s'", type(software), software)
325     if software is None:
326         logger.debug("software is None - EXIT!")
327         return None
328     elif "powered by " in software:
329         logger.debug("software='%s' has 'powered by' in it", software)
330         software = version.remove(strip_powered_by(software))
331     elif " hosted on " in software:
332         logger.debug("software='%s' has 'hosted on' in it", software)
333         software = version.remove(strip_hosted_on(software))
334     elif " by " in software:
335         logger.debug("software='%s' has ' by ' in it", software)
336         software = strip_until(software, " by ")
337     elif " see " in software:
338         logger.debug("software='%s' has ' see ' in it", software)
339         software = strip_until(software, " see ")
340
341     logger.debug("software[%s]='%s' - EXIT!", type(software), software)
342     return software