matrix-bot: Code cleanup matrix-bot: Code cleanup# matrix-bot: Code cleanup# matrix-bot: Ping on review neede Add .gitignore Working user ping
82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
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
|