]> git.mxchange.org Git - fba.git/blob - fba/helpers/software.py
7ce6fdbf8b7c798e4d093caec229f6db628274c0
[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 misskey
35 _misskey_aliases = [
36     "slipfox calckey",
37     "calckey",
38     "groundpolis",
39     "foundkey",
40     "cherrypick",
41     "meisskey",
42     "magnetar",
43     "keybump",
44     "dolphin",
45     "calckey social",
46     "azk.sns",
47     "firefish",
48     "qtmmsky",
49     "iceshrimp",
50     "owohub",
51     "re+",
52     "russkey",
53     "loverskey",
54     "hajkey",
55     "sharkey",
56     "renekey",
57     "renekey-lite",
58     "yoiyami",
59     "catnip",
60     "cyberskey",
61     "catodon",
62     "lycheebridge",
63     "goblin",
64     "miraiskey",
65     "lovers",
66     "rosekey",
67     "hijikey"
68 ]
69
70 @lru_cache
71 def alias(software: str) -> str:
72     logger.debug("software='%s'- CALLED!", software)
73
74     if not isinstance(software, str) and software is not None:
75         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
76     elif software == "":
77         raise ValueError("Parameter 'software' is empty")
78     elif software.startswith("re:"):
79         logger.debug("Cutting prefix 're:' from software='%s' ...", software)
80         software = software.split(":")[1]
81
82     logger.debug("software='%s'- BEFORE!", software)
83     cleared = tidyup.domain(software)
84     logger.debug("cleared='%s'- AFTER!", cleared)
85
86     if cleared in ["akkoma", "rebased", "akkounfucked", "ched", "incestoma", "revolver"]:
87         logger.debug("Setting pleroma: cleared='%s'", cleared)
88         cleared = "pleroma"
89     elif "radiant" in cleared:
90         logger.debug("Setting radiant: cleared='%s'", cleared)
91         cleared = "radiant"
92     elif cleared in ["hometown", "ecko", "fedibird", "glitchcafe", "kmyblue"] or "되는 마스토돈" in cleared or "mastodon" in cleared:
93         logger.debug("Setting mastodon: cleared='%s'", cleared)
94         cleared = "mastodon"
95     elif cleared in _misskey_aliases or "shumihub" in cleared or "мисскей" in cleared or "milkey" in cleared or "misskey" in cleared:
96         logger.debug("Setting misskey: cleared='%s'", cleared)
97         cleared = "misskey"
98     elif cleared in ["runtube.re", "islameye"]:
99         logger.debug("Setting peertube: cleared='%s'", cleared)
100         cleared = "peertube"
101     elif cleared in ["nextcloud social", "nextcloudpi", "storage share", "nube"] or "nextcloud" in cleared:
102         logger.debug("Setting nextcloud: cleared='%s'", cleared)
103         cleared = "nextcloud"
104     elif "discourse" in cleared:
105         logger.debug("Setting discourse: cleared='%s'", cleared)
106         cleared = "discourse"
107     elif cleared == "activity-relay":
108         logger.debug("Setting activityrelay: cleared='%s'", cleared)
109         cleared = "activityrelay"
110     elif "owncast" in cleared:
111         logger.debug("Setting owncast: cleared='%s'", cleared)
112         cleared = "owncast"
113     elif cleared in ["streams-hubzilla-social", "streams13"]:
114         logger.debug("Setting streams: cleared='%s'", cleared)
115         cleared = "streams"
116     elif cleared == "roadhouse":
117         logger.debug("Setting hubzilla: cleared='%s'", cleared)
118         cleared = "hubzilla"
119     elif cleared == "takahē":
120         logger.debug("Setting takahe: cleared='%s'", cleared)
121         cleared = "takahe"
122     elif cleared == "diaspora* social network":
123         logger.debug("Setting diaspora: cleared='%s'", cleared)
124         cleared = "diaspora"
125     elif cleared == "tkz relay":
126         logger.debug("Setting aoderelay: cleared='%s'", cleared)
127         cleared = "aoderelay"
128     elif cleared == "gitdab":
129         logger.debug("Setting forgejo: cleared='%s'", cleared)
130         cleared = "forgejo"
131     elif cleared == "mbin":
132         logger.debug("Setting kbin: cleared='%s'", cleared)
133         cleared = "kbin"
134     elif cleared == "write.as":
135         logger.debug("Setting writefreely: cleared='%s'", cleared)
136         cleared = "writefreely"
137     elif "gnu social" in cleared:
138         logger.debug("Setting gnusocial: cleared='%s'", cleared)
139         cleared = "gnusocial"
140     elif cleared.find("/") > 0:
141         logger.warning("Spliting of slash: cleared='%s'", cleared)
142         cleared = cleared.split("/")[-1]
143     elif cleared.find("|") > 0:
144         logger.warning("Spliting of pipe: cleared='%s'", cleared)
145         cleared = cleared.split("|")[0]
146     elif "powered by" in cleared:
147         logger.debug("cleared='%s' has 'powered by' in it", cleared)
148         cleared = strip_powered_by(cleared)
149     elif cleared.endswith(" experimental"):
150         logger.debug("cleared='%s' ends with 'experimental", cleared)
151         cleared = strip_until(cleared, "experimental")
152
153     if isinstance(cleared, str) and " by " in cleared:
154         logger.debug("cleared='%s' has ' by ' in it", cleared)
155         cleared = strip_until(cleared, " by ")
156     elif isinstance(cleared, str) and " - " in cleared:
157         logger.debug("cleared='%s' has ' - ' in it", cleared)
158         cleared = strip_until(cleared, " - ")
159     elif isinstance(cleared, str) and " see " in cleared:
160         logger.debug("cleared='%s' has ' see ' in it", cleared)
161         cleared = strip_until(cleared, " see ")
162
163     logger.debug("cleared['%s']='%s'", type(cleared), cleared)
164     if cleared == "":
165         logger.warning("tidyup.domain() left no cleared name behind: cleared='%s'", cleared)
166         cleared = None
167     else:
168         logger.debug("cleared='%s' is being cleaned up further ...", cleared)
169         cleared = cleared.rstrip("!").strip()
170
171     logger.debug("cleared[%s]='%s' - EXIT!", type(cleared), cleared)
172     return cleared
173
174 def strip_hosted_on(software: str) -> str:
175     logger.debug("software='%s' - CALLED!", software)
176
177     if not isinstance(software, str):
178         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
179     elif software == "":
180         raise ValueError("Parameter 'software' is empty")
181     elif "hosted on" not in software:
182         logger.warning("Cannot find 'hosted on' in software='%s'!", software)
183         return software
184
185     end = software.find("hosted on ")
186     logger.debug("end[%s]=%d", type(end), end)
187
188     software = software[0:end].strip()
189     logger.debug("software[%s]='%s'", type(software), software)
190
191     if " - " in software:
192         logger.debug("Stripping ' - ' of from software='%s' ...", software)
193         software = strip_until(software, " - ").strip()
194
195     logger.debug("software='%s' - EXIT!", software)
196     return software
197
198 def strip_powered_by(software: str) -> str:
199     logger.debug("software='%s' - CALLED!", software)
200
201     if not isinstance(software, str):
202         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
203     elif software == "":
204         raise ValueError("Parameter 'software' is empty")
205     elif "powered by" not in software:
206         logger.warning("Cannot find 'powered by' in software='%s'!", software)
207         return software
208
209     start = software.find("powered by ")
210     logger.debug("start[%s]=%d", type(start), start)
211
212     software = software[start + 11:].strip()
213     logger.debug("software='%s'", software)
214
215     if " - " in software:
216         logger.debug("Stripping ' - ' of from software='%s' ...", software)
217         software = strip_until(software, " - ").strip()
218
219     logger.debug("software='%s' - EXIT!", software)
220     return software
221
222 def strip_until(software: str, until: str) -> str:
223     logger.debug("software='%s',until='%s' - CALLED!", software, until)
224
225     if not isinstance(software, str):
226         raise ValueError(f"Parameter software[]='{type(software)}' is not of type 'str'")
227     elif software == "":
228         raise ValueError("Parameter 'software' is empty")
229     elif not isinstance(until, str):
230         raise ValueError(f"Parameter until[]='{type(until)}' is not of type 'str'")
231     elif until == "":
232         raise ValueError("Parameter 'until' is empty")
233     elif not until in software:
234         logger.warning("Cannot find until='%s' in software='%s'!", until, software)
235         return software
236
237     # Next, strip until part
238     end = software.strip().find(until)
239
240     logger.debug("end[%s]=%d", type(end), end)
241     if end > 0:
242         software = software[0:end].strip()
243
244     logger.debug("software='%s' - EXIT!", software)
245     return software
246
247 def is_relay(software: str) -> bool:
248     logger.debug("software='%s'- CALLED!", software)
249
250     if not isinstance(software, str):
251         raise ValueError(f"software[]='{type(software)}' is not type 'str'")
252     elif software == "":
253         raise ValueError("Parameter 'software' is empty")
254
255     found = software in relays
256
257     logger.debug("found='%s' - EXIT!", found)
258     return found