Skip to content

Commit 61fc217

Browse files
committed
fix bugs
1 parent b4a1a3d commit 61fc217

File tree

8 files changed

+135
-13
lines changed

8 files changed

+135
-13
lines changed

src/Bot/guilded_bot.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
async def send_iamup():
3232
async with aiohttp.ClientSession() as session:
3333
async with session.post(f"https://status.astroid.cc/monitor/iamup/guilded") as r:
34+
await session.close()
3435
if r.status == 200:
3536
print("Sent up status.")
3637
else:

src/Bot/nerimity_bot.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ async def send_message(endpoint, params):
2323
async def send_iamup():
2424
async with aiohttp.ClientSession() as session:
2525
async with session.post(f"https://status.astroid.cc/monitor/iamup/nerimity") as r:
26+
await session.close()
2627
if r.status == 200:
2728
print("Sent up status.")
2829
else:

src/api.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import logging
3232
import astroidapi
3333
import threading
34+
import subprocess
3435

3536
# Configure logging to log to a file
3637
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s")
@@ -84,7 +85,16 @@ def view_logs(token: Annotated[str, fastapi.Query(max_length=85, min_length=10)]
8485

8586
@api.get("/ga-test")
8687
def ga_test():
87-
return fastapi.responses.JSONResponse(status_code=200, content={"commited": "210824-15"})
88+
try:
89+
# Get the current commit hash
90+
result = subprocess.run(['git', 'rev-parse', 'HEAD'],
91+
capture_output=True, text=True, check=True)
92+
commit_hash = result.stdout.strip()[:7] # Get short hash (first 7 chars)
93+
94+
return fastapi.responses.JSONResponse(status_code=200, content={"commited": commit_hash})
95+
except subprocess.CalledProcessError:
96+
# Fallback if git command fails
97+
return fastapi.responses.JSONResponse(status_code=200, content={"commited": "unknown"})
8898

8999
@api.get("/assets/{asset}", description="Get an asset.")
90100
def get_asset(asset: str, width: int = None, height: int = None):

src/astroidapi/emoji_handler.py

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,20 @@ async def convert_message(message, sender, receiver, endpoint):
8484
endpoint_data = await surrealdb_handler.get_endpoint(endpoint, __file__)
8585
if endpoint_data["config"]["emoji_filtering"]:
8686
message = message.replace(emoji, "")
87+
88+
elif sender == "revolt":
89+
emojis = re.findall(r':\w+:', message)
90+
print(emojis)
91+
for emoji in emojis:
92+
print(emoji)
93+
emoji_data = await convert_emoji(emoji, sender, receiver, endpoint)
94+
print(emoji_data)
95+
if emoji_data is not None:
96+
message = message.replace(emoji, emoji_data)
97+
else:
98+
endpoint_data = await surrealdb_handler.get_endpoint(endpoint, __file__)
99+
if endpoint_data["config"]["emoji_filtering"]:
100+
message = message.replace(emoji, "")
87101

88102
return message
89103

@@ -257,4 +271,56 @@ async def _sync_discord_emojis(endpoint, platform):
257271
print(f"Deleted emoji file {emoji['id']}.png")
258272
except Exception as e:
259273
print(f"Failed to delete emoji file {emoji['id']}.png")
260-
continue
274+
continue
275+
276+
277+
async def add_emoji(endpoint, emoji):
278+
endpoint_data = await surrealdb_handler.get_endpoint(int(endpoint), __file__)
279+
endpoint_emojis = endpoint_data["config"]["emojis"]
280+
endpoint_emojis.append(emoji)
281+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
282+
return {
283+
"message": f"Added emoji {emoji} to endpoint {endpoint}"
284+
}
285+
286+
287+
async def remove_emoji(endpoint, emoji):
288+
endpoint_data = await surrealdb_handler.get_endpoint(int(endpoint), __file__)
289+
endpoint_emojis = endpoint_data["config"]["emojis"]
290+
for emoji_data in endpoint_emojis:
291+
if "discord" in emoji_data.keys():
292+
if emoji_data["discord"] == emoji["discord"]:
293+
endpoint_emojis.remove(endpoint_emojis[endpoint_emojis.index(emoji_data)])
294+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
295+
return {"message": f"Removed emoji {emoji['discord']} from endpoint {endpoint}"}
296+
if "nerimity" in emoji_data.keys():
297+
if emoji_data["nerimity"] == emoji["nerimity"]:
298+
endpoint_emojis.remove(endpoint_emojis[endpoint_emojis.index(emoji_data)])
299+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
300+
return {"message": f"Removed emoji {emoji['nerimity']} from endpoint {endpoint}"}
301+
if "guilded" in emoji_data.keys():
302+
if emoji_data["guilded"] == emoji["guilded"]:
303+
endpoint_emojis.remove(endpoint_emojis[endpoint_emojis.index(emoji_data)])
304+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
305+
return {"message": f"Removed emoji {emoji['guilded']} from endpoint {endpoint}"}
306+
if "revolt" in emoji_data.keys():
307+
if emoji_data["revolt"] == emoji["revolt"]:
308+
endpoint_emojis.remove(endpoint_emojis[endpoint_emojis.index(emoji_data)])
309+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
310+
return {"message": f"Removed emoji {emoji['revolt']} from endpoint {endpoint}"}
311+
312+
313+
async def update_emoji(endpoint, emoji):
314+
endpoint_data = await surrealdb_handler.get_endpoint(int(endpoint), __file__)
315+
endpoint_emojis = endpoint_data["config"]["emojis"]
316+
for emoji_data in endpoint_emojis:
317+
if "discord" in emoji_data.keys():
318+
emoji_data["discord"] = emoji["discord"]
319+
if "nerimity" in emoji_data.keys():
320+
emoji_data["nerimity"] = emoji["nerimity"]
321+
if "guilded" in emoji_data.keys():
322+
emoji_data["guilded"] = emoji["guilded"]
323+
if "revolt" in emoji_data.keys():
324+
emoji_data["revolt"] = emoji["revolt"]
325+
await surrealdb_handler.write_to_structure(int(endpoint), "config.emojis", endpoint_emojis)
326+
return {"message": f"Updated emoji {emoji['discord']} in endpoint {endpoint}"}

src/astroidapi/endpoint_update_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ async def update_endpoint(
223223
if message_attachments:
224224
if "," in message_attachments:
225225
for val in message_attachments.split(","):
226-
if val.lower() not in [x.lower() for x in endpoint_data["meta"]["message"]["attachments"]]:
227-
endpoint_data["meta"]["message"]["attachments"].append(val.lower())
226+
if val not in [x for x in endpoint_data["meta"]["message"]["attachments"]]:
227+
endpoint_data["meta"]["message"]["attachments"].append(val)
228228
else:
229229
endpoint_data["meta"]["message"]["attachments"] = [message_attachments]
230230

src/astroidapi/queue_processor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ async def clearLoadedMessage(cls, endpoint, message):
7676

7777
@classmethod
7878
async def appendMessage(cls, endpoint, updated_json):
79+
is_suspend = await surrealdb_handler.Suspension.Endpoints.get_suspend_status(endpoint)
80+
if is_suspend["suspended"]:
81+
print(f"Endpoint {endpoint} is suspended. Not appending message.")
82+
return False
7983
print(f"Appending message for endpoint {endpoint}")
8084
if updated_json is None:
8185
raise Exception("You must provide a valid 'updated_json' json object to appendMessage.")

src/astroidapi/sending_handler.py

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,21 @@ async def send_to_discord(cls, updated_json, endpoint, attachments: list = None)
127127
else:
128128
raise errors.SendingError.ChannelNotFound(f'The channel {updated_json["meta"]["sender-channel"]} ({updated_json["meta"]["sender"]}) does not seem to be a registered channel on other platforms.')
129129
except IndexError:
130+
await surrealdb_handler.QueueHandler.remove_from_queue(endpoint, updated_json)
130131
return True
131132
nextcord_files = []
132133
if attachments is not None:
133134
for attachment in attachments:
134135
file = nextcord.File(attachment.name, filename=attachment.name.split("/")[-1])
135136
nextcord_files.append(file)
136137
await surrealdb_handler.AttachmentProcessor.update_attachment(attachment.name.split("/")[-1].split(".")[0], sentby="discord")
137-
updated_json["meta"]["message"]["content"] = await emoji_handler.convert_message(updated_json["meta"]["message"]["content"], updated_json["meta"]["sender"], "discord", endpoint)
138+
message_content = updated_json["meta"]["message"].get("content")
139+
print(message_content)
140+
if message_content is not None and message_content != "":
141+
updated_json["meta"]["message"]["content"] = await emoji_handler.convert_message(message_content, updated_json["meta"]["sender"], "discord", endpoint)
138142
async with aiohttp.ClientSession() as session:
139143
webhook_obj = nextcord.Webhook.from_url(webhook, session=session)
140-
message_content = updated_json["meta"]["message"]["content"]
144+
message_content = updated_json["meta"]["message"].get("content")
141145
if message_content is None or message_content == "" or message_content == " ":
142146
if updated_json["meta"]["message"]["attachments"] is not None:
143147
if updated_json["meta"]["message"]["attachments"] is not None:
@@ -177,26 +181,28 @@ async def send_to_guilded(cls, updated_json, endpoint, attachments: list = None)
177181
else:
178182
raise errors.SendingError.ChannelNotFound(f'The channel {updated_json["meta"]["sender-channel"]} ({updated_json["meta"]["sender"]}) does not seem to be a registered channel on other platforms.')
179183
except IndexError:
184+
await surrealdb_handler.QueueHandler.remove_from_queue(endpoint, updated_json)
180185
return True
181186
guilded_files = []
182187
if attachments is not None:
183188
for attachment in attachments:
184189
file = guilded.File(attachment.name, filename=attachment.name.split("/")[-1])
185190
guilded_files.append(file)
186191
await surrealdb_handler.AttachmentProcessor.update_attachment(attachment.name.split("/")[-1].split(".")[0], sentby="guilded")
187-
updated_json["meta"]["message"]["content"] = await emoji_handler.convert_message(updated_json["meta"]["message"]["content"], updated_json["meta"]["sender"], "guilded", endpoint)
192+
message_content = updated_json["meta"]["message"].get("content")
193+
if message_content is None or message_content == "" or message_content == " ":
194+
updated_json["meta"]["message"]["content"] = await emoji_handler.convert_message(message_content, updated_json["meta"]["sender"], "guilded", endpoint)
188195
async with aiohttp.ClientSession() as session:
189196
asyncio.create_task(read_handler.ReadHandler.mark_read(endpoint, "guilded"))
190197
webhook_obj = guilded.Webhook.from_url(webhook, session=session)
191198
try:
192-
message_content = updated_json["meta"]["message"]["content"]
193199
try:
194200
message_content = formatter.Format.format_links_guilded_safe(message_content)
195201
except Exception as e:
196202
print("[SendToGuilded] Failed to format links: ", e)
197-
if message_content is None or message_content == "" or message_content == " ":
203+
if message_content is None and message_content != "":
198204
if updated_json["meta"]["message"]["attachments"] is not None:
199-
message_content = "‎ "
205+
message_content = "‎"
200206
if updated_json["meta"]["message"]["isReply"] is True:
201207
reply_emoji_filtered = await emoji_handler.convert_message(updated_json["meta"]["message"]["reply"]["message"], updated_json["meta"]["sender"], "guilded", endpoint)
202208
message_content = f"> **{updated_json['meta']['message']['reply']['author']}**\n> {reply_emoji_filtered}\n\n{message_content}"
@@ -237,10 +243,12 @@ async def send_to_nerimity(cls, updated_json, endpoint, attachments: list = None
237243
else:
238244
raise errors.SendingError.ChannelNotFound(f'The channel {sender_channel} ({updated_json["meta"]["sender"]}) does not seem to be a registered channel on other platforms.')
239245
except IndexError:
246+
await surrealdb_handler.QueueHandler.remove_from_queue(endpoint, updated_json)
240247
return True
241248
message_author_name = response_json["meta"]["message"]["author"]["name"]
242-
message_content = response_json["meta"]["message"]["content"]
243-
message_content = await emoji_handler.convert_message(message_content, updated_json["meta"]["sender"], "nerimity", endpoint)
249+
message_content = response_json["meta"]["message"].get("content")
250+
if message_content is not None and message_content != "":
251+
message_content = await emoji_handler.convert_message(message_content, updated_json["meta"]["sender"], "nerimity", endpoint)
244252
if updated_json["config"]["isbeta"] is True:
245253
headers = {
246254

@@ -309,6 +317,7 @@ async def send_to_revolt(cls, updated_json, endpoint, attachments: list = None):
309317
else:
310318
raise errors.SendingError.ChannelNotFound(f"The channel {updated_json["meta"]["sender-channel"]} ({updated_json["meta"]["sender"]}) does not seem to be a registered channel on other platforms.")
311319
except IndexError:
320+
await surrealdb_handler.QueueHandler.remove_from_queue(endpoint, updated_json)
312321
return True
313322
headers = {
314323
"X-Bot-Token": f"{config.REVOLT_TOKEN}"
@@ -319,8 +328,31 @@ async def send_to_revolt(cls, updated_json, endpoint, attachments: list = None):
319328
"avatar": updated_json["meta"]["message"]["author"]["avatar"],
320329
"name": updated_json["meta"]["message"]["author"]["name"]
321330
},
322-
"content": updated_json["meta"]["message"]["content"]
331+
"content": updated_json["meta"]["message"].get("content")
323332
}
333+
message_content = updated_json["meta"]["message"].get("content")
334+
if message_content is not None and message_content != "":
335+
payload["content"] = await emoji_handler.convert_message(payload["content"], updated_json["meta"]["sender"], "revolt", endpoint)
336+
if updated_json["meta"]["message"]["isReply"] is True and message_content is not None:
337+
reply_emoji_filtered = await emoji_handler.convert_message(updated_json["meta"]["message"]["reply"]["message"], updated_json["meta"]["sender"], "revolt", endpoint)
338+
payload["content"] = f"> **{updated_json['meta']['message']['reply']['author']}**\n> {reply_emoji_filtered}\n\n{payload['content']}"
339+
if attachments is not None:
340+
formdata = aiohttp.FormData()
341+
try:
342+
if '../' in attachments[0].name or '..\\' in attachments[0].name:
343+
raise Exception("Invalid file path")
344+
else:
345+
formdata.add_field("file", open(os.path.abspath(attachments[0].name), "rb"), filename=attachments[0].name.split("/")[-1], content_type=f"image/{attachments[0].name.split('.')[-1]}")
346+
async with aiohttp.ClientSession() as session:
347+
async with session.post("https://autumn.revolt.chat/attachments", headers=headers, data=formdata) as r:
348+
if r.ok:
349+
payload["attachments"] = [(await r.json())["id"]]
350+
else:
351+
raise errors.SendingError.SendFromRevoltError(f"Failed to upload attachment to revolt. Response: {r.status}, {r.reason}")
352+
await session.close()
353+
except Exception as e:
354+
print("Error uploading attachment to revolt: ", e)
355+
324356

325357
async with aiohttp.ClientSession() as session:
326358
async with session.post(url, headers=headers, json=payload) as r:

src/astroidapi/suspension_handler.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ async def is_suspended(cls, endpoint_id):
2424
except TypeError:
2525
return False
2626

27+
@classmethod
28+
async def get_suspend_info(cls, endpoint_id):
29+
try:
30+
info = await surrealdb_handler.Suspension.get_suspend_status(endpoint_id)
31+
return info["reason"]
32+
except errors.SurrealDBHandler.GetSuspensionStatusError as e:
33+
raise errors.SuspensionHandlerError.GetSuspensionStatusError(e)
34+
2735
@classmethod
2836
async def suspend(cls, endpoint_id, reason, suspended_by: int, expire_at: int = None):
2937
try:

0 commit comments

Comments
 (0)