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