matrix-bot: Init working sending and receiving
matrix-bot: Code cleanup matrix-bot: Code cleanup# matrix-bot: Code cleanup# matrix-bot: Ping on review neede Add .gitignore Working user ping
This commit is contained in:
81
pkgs/matrix-bot/matrix_bot/bot.py
Normal file
81
pkgs/matrix-bot/matrix_bot/bot.py
Normal file
@@ -0,0 +1,81 @@
|
||||
import logging
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
import time
|
||||
from pathlib import Path
|
||||
import json
|
||||
import aiohttp
|
||||
from nio import (
|
||||
AsyncClient,
|
||||
JoinResponse,
|
||||
JoinedMembersResponse,
|
||||
MatrixRoom,
|
||||
RoomMessageText,
|
||||
)
|
||||
|
||||
from matrix_bot.gitea import (
|
||||
GiteaData,
|
||||
PullState,
|
||||
fetch_pull_requests,
|
||||
fetch_repo_labels,
|
||||
)
|
||||
|
||||
from .locked_open import read_locked_file, write_locked_file
|
||||
from .matrix import MatrixData, send_message
|
||||
|
||||
|
||||
async def message_callback(room: MatrixRoom, event: RoomMessageText) -> None:
|
||||
print(
|
||||
f"Message received in room {room.display_name}\n"
|
||||
f"{room.user_name(event.sender)} | {event.body}"
|
||||
)
|
||||
|
||||
|
||||
async def bot_run(
|
||||
client: AsyncClient,
|
||||
http: aiohttp.ClientSession,
|
||||
matrix: MatrixData,
|
||||
gitea: GiteaData,
|
||||
) -> None:
|
||||
# If you made a new room and haven't joined as that user, you can use
|
||||
room: JoinResponse = await client.join(matrix.room)
|
||||
|
||||
users: JoinedMembersResponse = await client.joined_members(room.room_id)
|
||||
|
||||
if not users.transport_response.ok:
|
||||
raise Exception(f"Failed to get users {users}")
|
||||
|
||||
for user in users.members:
|
||||
print(f"User: {user.user_id} {user.display_name}")
|
||||
|
||||
labels = await fetch_repo_labels(gitea, http)
|
||||
label_ids: list[int] = []
|
||||
for label in labels:
|
||||
if label["name"] in gitea.trigger_labels:
|
||||
label_ids.append(label["id"])
|
||||
|
||||
tstart = time.time()
|
||||
pulls = await fetch_pull_requests(gitea, http, limit=50, state=PullState.ALL)
|
||||
|
||||
last_updated_path = Path("last_updated.json")
|
||||
last_updated = read_locked_file(last_updated_path)
|
||||
|
||||
for pull in pulls:
|
||||
if pull["requested_reviewers"] and pull["mergeable"]:
|
||||
if last_updated == {}:
|
||||
last_updated = pull
|
||||
elif pull["updated_at"] < last_updated["updated_at"]:
|
||||
last_updated = pull
|
||||
else:
|
||||
continue
|
||||
log.info(f"Pull request {pull['title']} needs review")
|
||||
message = f"Pull request {pull['title']} needs review\n{pull['html_url']}"
|
||||
await send_message(client, room, message, user_ids=["@qubasa:gchq.icu"])
|
||||
|
||||
write_locked_file(last_updated_path, last_updated)
|
||||
|
||||
tend = time.time()
|
||||
tdiff = round(tend - tstart)
|
||||
log.debug(f"Time taken: {tdiff}s")
|
||||
|
||||
# await client.sync_forever(timeout=30000) # milliseconds
|
||||
Reference in New Issue
Block a user