]> 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 ]
80
81 @lru_cache
82 def alias(software: str) -> str:
83     logger.debug("software='%s'- CALLED!", software)
84
85     if not isinstance(software, str) and software is not None:
86         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
87     elif software == "":
88         raise ValueError("Parameter 'software' is empty")
89     elif software.startswith("re:"):
90         logger.debug("Cutting prefix 're:' from software='%s' ...", software)
91         software = software.split(":")[1]
92
93     logger.debug("software='%s'- BEFORE!", software)
94     cleared = tidyup.domain(software)
95     logger.debug("cleared='%s'- AFTER!", cleared)
96
97     if cleared in ["akkoma", "rebased", "akkounfucked", "ched", "incestoma", "revolver"] or "pleroma" in cleared:
98         logger.debug("Setting pleroma: cleared='%s'", cleared)
99         cleared = "pleroma"
100     elif "radiant" in cleared:
101         logger.debug("Setting radiant: cleared='%s'", cleared)
102         cleared = "radiant"
103     elif cleared in _mastodon_aliases or "되는 마스토돈" in cleared or "mastodon" in cleared:
104         logger.debug("Setting mastodon: cleared='%s'", cleared)
105         cleared = "mastodon"
106     elif cleared in _misskey_aliases or "shumihub" in cleared or "мисскей" in cleared or "milkey" in cleared or "misskey" in cleared:
107         logger.debug("Setting misskey: cleared='%s'", cleared)
108         cleared = "misskey"
109     elif cleared in ["runtube.re", "islameye"]:
110         logger.debug("Setting peertube: cleared='%s'", cleared)
111         cleared = "peertube"
112     elif cleared in ["nextcloud social", "nextcloudpi", "storage share", "nube"] or "nextcloud" in cleared:
113         logger.debug("Setting nextcloud: cleared='%s'", cleared)
114         cleared = "nextcloud"
115     elif "discourse" in cleared:
116         logger.debug("Setting discourse: cleared='%s'", cleared)
117         cleared = "discourse"
118     elif cleared == "activity-relay":
119         logger.debug("Setting activityrelay: cleared='%s'", cleared)
120         cleared = "activityrelay"
121     elif "owncast" in cleared:
122         logger.debug("Setting owncast: cleared='%s'", cleared)
123         cleared = "owncast"
124     elif cleared in ["streams-hubzilla-social", "streams13"]:
125         logger.debug("Setting streams: cleared='%s'", cleared)
126         cleared = "streams"
127     elif cleared == "roadhouse":
128         logger.debug("Setting hubzilla: cleared='%s'", cleared)
129         cleared = "hubzilla"
130     elif cleared == "takahē":
131         logger.debug("Setting takahe: cleared='%s'", cleared)
132         cleared = "takahe"
133     elif cleared == "diaspora* social network":
134         logger.debug("Setting diaspora: cleared='%s'", cleared)
135         cleared = "diaspora"
136     elif cleared == "tkz relay":
137         logger.debug("Setting aoderelay: cleared='%s'", cleared)
138         cleared = "aoderelay"
139     elif cleared == "gitdab":
140         logger.debug("Setting forgejo: cleared='%s'", cleared)
141         cleared = "forgejo"
142     elif cleared == "mbin":
143         logger.debug("Setting kbin: cleared='%s'", cleared)
144         cleared = "kbin"
145     elif cleared == "write.as":
146         logger.debug("Setting writefreely: cleared='%s'", cleared)
147         cleared = "writefreely"
148     elif "gnu social" in cleared:
149         logger.debug("Setting gnusocial: cleared='%s'", cleared)
150         cleared = "gnusocial"
151     elif cleared.find("/") > 0:
152         logger.warning("Spliting of slash: cleared='%s'", cleared)
153         cleared = cleared.split("/")[-1]
154     elif cleared.find("|") > 0:
155         logger.warning("Spliting of pipe: cleared='%s'", cleared)
156         cleared = cleared.split("|")[0]
157     elif "powered by" in cleared:
158         logger.debug("cleared='%s' has 'powered by' in it", cleared)
159         cleared = strip_powered_by(cleared)
160     elif cleared.endswith(" experimental"):
161         logger.debug("cleared='%s' ends with 'experimental", cleared)
162         cleared = strip_until(cleared, "experimental")
163
164     if isinstance(cleared, str) and " by " in cleared:
165         logger.debug("cleared='%s' has ' by ' in it", cleared)
166         cleared = strip_until(cleared, " by ")
167     elif isinstance(cleared, str) and " - " in cleared:
168         logger.debug("cleared='%s' has ' - ' in it", cleared)
169         cleared = strip_until(cleared, " - ")
170     elif isinstance(cleared, str) and " see " in cleared:
171         logger.debug("cleared='%s' has ' see ' in it", cleared)
172         cleared = strip_until(cleared, " see ")
173
174     logger.debug("cleared['%s']='%s'", type(cleared), cleared)
175     if cleared == "":
176         logger.warning("tidyup.domain() left no cleared name behind: cleared='%s'", cleared)
177         cleared = None
178     else:
179         logger.debug("cleared='%s' is being cleaned up further ...", cleared)
180         cleared = cleared.rstrip("!").strip()
181
182     logger.debug("cleared[%s]='%s' - EXIT!", type(cleared), cleared)
183     return cleared
184
185 def strip_hosted_on(software: str) -> str:
186     logger.debug("software='%s' - CALLED!", software)
187
188     if not isinstance(software, str):
189         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
190     elif software == "":
191         raise ValueError("Parameter 'software' is empty")
192     elif "hosted on" not in software:
193         logger.warning("Cannot find 'hosted on' in software='%s'!", software)
194         return software
195
196     end = software.find("hosted on ")
197     logger.debug("end[%s]=%d", type(end), end)
198
199     software = software[0:end].strip()
200     logger.debug("software[%s]='%s'", type(software), software)
201
202     if " - " in software:
203         logger.debug("Stripping ' - ' of from software='%s' ...", software)
204         software = strip_until(software, " - ").strip()
205
206     logger.debug("software='%s' - EXIT!", software)
207     return software
208
209 def strip_powered_by(software: str) -> str:
210     logger.debug("software='%s' - CALLED!", software)
211
212     if not isinstance(software, str):
213         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
214     elif software == "":
215         raise ValueError("Parameter 'software' is empty")
216     elif "powered by" not in software:
217         logger.warning("Cannot find 'powered by' in software='%s'!", software)
218         return software
219
220     start = software.find("powered by ")
221     logger.debug("start[%s]=%d", type(start), start)
222
223     software = software[start + 11:].strip()
224     logger.debug("software='%s'", software)
225
226     if " - " in software:
227         logger.debug("Stripping ' - ' of from software='%s' ...", software)
228         software = strip_until(software, " - ").strip()
229
230     logger.debug("software='%s' - EXIT!", software)
231     return software
232
233 def strip_until(software: str, until: str) -> str:
234     logger.debug("software='%s',until='%s' - CALLED!", software, until)
235
236     if not isinstance(software, str):
237         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
238     elif software == "":
239         raise ValueError("Parameter 'software' is empty")
240     elif not isinstance(until, str):
241         raise ValueError(f"Parameter until[]='{type(until)}' is not of type 'str'")
242     elif until == "":
243         raise ValueError("Parameter 'until' is empty")
244     elif not until in software:
245         logger.warning("Cannot find until='%s' in software='%s'!", until, software)
246         return software
247
248     # Next, strip until part
249     end = software.strip().find(until)
250
251     logger.debug("end[%s]=%d", type(end), end)
252     if end > 0:
253         software = software[0:end].strip()
254
255     logger.debug("software='%s' - EXIT!", software)
256     return software
257
258 def is_relay(software: str) -> bool:
259     logger.debug("software='%s'- CALLED!", software)
260
261     if not isinstance(software, str):
262         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
263     elif software == "":
264         raise ValueError("Parameter 'software' is empty")
265
266     found = software in relays
267
268     logger.debug("found='%s' - EXIT!", found)
269     return found