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