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