From 0ee79a5fabcf1c54c8480e24ddbf159fc4ad9c17 Mon Sep 17 00:00:00 2001 From: Qubasa Date: Wed, 3 Jul 2024 17:33:33 +0200 Subject: [PATCH] matrix-bot: Move it to clan-infra --- pkgs/flake-module.nix | 1 - pkgs/matrix-bot/.envrc | 6 - pkgs/matrix-bot/.gitignore | 2 - pkgs/matrix-bot/bin/mbot | 13 -- pkgs/matrix-bot/default.nix | 41 ---- pkgs/matrix-bot/flake-module.nix | 14 -- pkgs/matrix-bot/matrix_bot/__init__.py | 161 ---------------- pkgs/matrix-bot/matrix_bot/__main__.py | 4 - pkgs/matrix-bot/matrix_bot/avatar.png | Bin 107539 -> 0 bytes pkgs/matrix-bot/matrix_bot/changelog_bot.py | 202 -------------------- pkgs/matrix-bot/matrix_bot/custom_logger.py | 97 ---------- pkgs/matrix-bot/matrix_bot/gitea.py | 88 --------- pkgs/matrix-bot/matrix_bot/locked_open.py | 31 --- pkgs/matrix-bot/matrix_bot/main.py | 50 ----- pkgs/matrix-bot/matrix_bot/matrix.py | 88 --------- pkgs/matrix-bot/matrix_bot/openai.py | 123 ------------ pkgs/matrix-bot/matrix_bot/review_bot.py | 90 --------- pkgs/matrix-bot/pyproject.toml | 59 ------ pkgs/matrix-bot/shell.nix | 30 --- 19 files changed, 1100 deletions(-) delete mode 100644 pkgs/matrix-bot/.envrc delete mode 100644 pkgs/matrix-bot/.gitignore delete mode 100755 pkgs/matrix-bot/bin/mbot delete mode 100644 pkgs/matrix-bot/default.nix delete mode 100644 pkgs/matrix-bot/flake-module.nix delete mode 100644 pkgs/matrix-bot/matrix_bot/__init__.py delete mode 100644 pkgs/matrix-bot/matrix_bot/__main__.py delete mode 100644 pkgs/matrix-bot/matrix_bot/avatar.png delete mode 100644 pkgs/matrix-bot/matrix_bot/changelog_bot.py delete mode 100644 pkgs/matrix-bot/matrix_bot/custom_logger.py delete mode 100644 pkgs/matrix-bot/matrix_bot/gitea.py delete mode 100644 pkgs/matrix-bot/matrix_bot/locked_open.py delete mode 100644 pkgs/matrix-bot/matrix_bot/main.py delete mode 100644 pkgs/matrix-bot/matrix_bot/matrix.py delete mode 100644 pkgs/matrix-bot/matrix_bot/openai.py delete mode 100644 pkgs/matrix-bot/matrix_bot/review_bot.py delete mode 100644 pkgs/matrix-bot/pyproject.toml delete mode 100644 pkgs/matrix-bot/shell.nix diff --git a/pkgs/flake-module.nix b/pkgs/flake-module.nix index 5d6a1cf5..b4ee8e21 100644 --- a/pkgs/flake-module.nix +++ b/pkgs/flake-module.nix @@ -8,7 +8,6 @@ ./schemas/flake-module.nix ./webview-ui/flake-module.nix ./distro-packages/flake-module.nix - ./matrix-bot/flake-module.nix ]; perSystem = diff --git a/pkgs/matrix-bot/.envrc b/pkgs/matrix-bot/.envrc deleted file mode 100644 index 0b941ecc..00000000 --- a/pkgs/matrix-bot/.envrc +++ /dev/null @@ -1,6 +0,0 @@ -source_up - -watch_file flake-module.nix shell.nix default.nix - -# Because we depend on nixpkgs sources, uploading to builders takes a long time -use flake .#matrix-bot --builders '' diff --git a/pkgs/matrix-bot/.gitignore b/pkgs/matrix-bot/.gitignore deleted file mode 100644 index 8b897a39..00000000 --- a/pkgs/matrix-bot/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.json -**/data diff --git a/pkgs/matrix-bot/bin/mbot b/pkgs/matrix-bot/bin/mbot deleted file mode 100755 index bd72f9a6..00000000 --- a/pkgs/matrix-bot/bin/mbot +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys - -sys.path.insert( - 0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) -) - -from matrix_bot import main # NOQA - -if __name__ == "__main__": - main() - diff --git a/pkgs/matrix-bot/default.nix b/pkgs/matrix-bot/default.nix deleted file mode 100644 index f6244c0f..00000000 --- a/pkgs/matrix-bot/default.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ - python3, - setuptools, - matrix-nio, - aiofiles, - aiohttp, - markdown2, - ... -}: - -let - - pythonDependencies = [ - matrix-nio - aiofiles - aiohttp - markdown2 - ]; - - runtimeDependencies = [ ]; - - testDependencies = pythonDependencies ++ runtimeDependencies ++ [ ]; -in -python3.pkgs.buildPythonApplication { - name = "matrix-bot"; - src = ./.; - format = "pyproject"; - - nativeBuildInputs = [ setuptools ]; - - propagatedBuildInputs = pythonDependencies; - - passthru.testDependencies = testDependencies; - - # Clean up after the package to avoid leaking python packages into a devshell - postFixup = '' - rm $out/nix-support/propagated-build-inputs - ''; - - meta.mainProgram = "matrix-bot"; -} diff --git a/pkgs/matrix-bot/flake-module.nix b/pkgs/matrix-bot/flake-module.nix deleted file mode 100644 index f7b15f7f..00000000 --- a/pkgs/matrix-bot/flake-module.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ ... }: -{ - perSystem = - { self', pkgs, ... }: - { - - devShells.matrix-bot = pkgs.callPackage ./shell.nix { inherit (self'.packages) matrix-bot; }; - packages = { - matrix-bot = pkgs.python3.pkgs.callPackage ./default.nix { }; - }; - - checks = { }; - }; -} diff --git a/pkgs/matrix-bot/matrix_bot/__init__.py b/pkgs/matrix-bot/matrix_bot/__init__.py deleted file mode 100644 index 0e422046..00000000 --- a/pkgs/matrix-bot/matrix_bot/__init__.py +++ /dev/null @@ -1,161 +0,0 @@ -import argparse -import asyncio -import logging -import os -import sys -from pathlib import Path - -from matrix_bot.custom_logger import setup_logging -from matrix_bot.gitea import GiteaData -from matrix_bot.main import bot_main -from matrix_bot.matrix import MatrixData - -log = logging.getLogger(__name__) - -curr_dir = Path(__file__).parent -data_dir = Path(os.getcwd()) / "data" - - -def create_parser(prog: str | None = None) -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - prog=prog, - description="A gitea bot for matrix", - formatter_class=argparse.RawTextHelpFormatter, - ) - - parser.add_argument( - "--debug", - help="Enable debug logging", - action="store_true", - default=False, - ) - - parser.add_argument( - "--server", - help="The matrix server to connect to", - default="https://matrix.clan.lol", - ) - - parser.add_argument( - "--user", - help="The matrix user to connect as", - default="@clan-bot:clan.lol", - ) - - parser.add_argument( - "--avatar", - help="The path to the image to use as the avatar", - default=curr_dir / "avatar.png", - ) - - parser.add_argument( - "--repo-owner", - help="The owner of gitea the repository", - default="clan", - ) - parser.add_argument( - "--repo-name", - help="The name of the repository", - default="clan-core", - ) - - parser.add_argument( - "--changelog-room", - help="The matrix room to join for the changelog bot", - default="#bot-test:gchq.icu", - ) - - parser.add_argument( - "--review-room", - help="The matrix room to join for the review bot", - default="#bot-test:gchq.icu", - ) - - parser.add_argument( - "--changelog-frequency", - help="The frequency to check for changelog updates in days", - default=7, - type=int, - ) - - def valid_weekday(value: str) -> str: - days = [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday", - ] - if value not in days: - raise argparse.ArgumentTypeError( - f"{value} is not a valid weekday. Choose from {', '.join(days)}" - ) - return value - - parser.add_argument( - "--publish-day", - help="The day of the week to publish the changelog. Ignored if changelog-frequency is less than 7 days.", - default="Wednesday", - type=valid_weekday, - ) - - parser.add_argument( - "--gitea-url", - help="The gitea url to connect to", - default="https://git.clan.lol", - ) - - parser.add_argument( - "--data-dir", - help="The directory to store data", - default=data_dir, - type=Path, - ) - - return parser - - -def main() -> None: - parser = create_parser() - args = parser.parse_args() - - if args.debug: - setup_logging(logging.DEBUG, root_log_name=__name__.split(".")[0]) - log.debug("Debug log activated") - else: - setup_logging(logging.INFO, root_log_name=__name__.split(".")[0]) - - password = os.getenv("MATRIX_PASSWORD") - if not password: - log.error("No password provided set the MATRIX_PASSWORD environment variable") - - matrix = MatrixData( - server=args.server, - user=args.user, - avatar=args.avatar, - changelog_room=args.changelog_room, - changelog_frequency=args.changelog_frequency, - publish_day=args.publish_day, - review_room=args.review_room, - password=password, - ) - - gitea = GiteaData( - url=args.gitea_url, - owner=args.repo_owner, - repo=args.repo_name, - access_token=os.getenv("GITEA_ACCESS_TOKEN"), - ) - - args.data_dir.mkdir(parents=True, exist_ok=True) - - try: - asyncio.run(bot_main(matrix, gitea, args.data_dir)) - except KeyboardInterrupt: - print("User Interrupt", file=sys.stderr) - - -if __name__ == "__main__": - main() diff --git a/pkgs/matrix-bot/matrix_bot/__main__.py b/pkgs/matrix-bot/matrix_bot/__main__.py deleted file mode 100644 index 868d99ef..00000000 --- a/pkgs/matrix-bot/matrix_bot/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -from . import main - -if __name__ == "__main__": - main() diff --git a/pkgs/matrix-bot/matrix_bot/avatar.png b/pkgs/matrix-bot/matrix_bot/avatar.png deleted file mode 100644 index e9f5cd47eb4dc8d08f103e88694ab80f97c8b828..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107539 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%0A;)I!5 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%0D$x^ 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 IM6N<$g4^|i;Q#;t diff --git a/pkgs/matrix-bot/matrix_bot/changelog_bot.py b/pkgs/matrix-bot/matrix_bot/changelog_bot.py deleted file mode 100644 index 4fc5d3d1..00000000 --- a/pkgs/matrix-bot/matrix_bot/changelog_bot.py +++ /dev/null @@ -1,202 +0,0 @@ -import asyncio -import datetime -import json -import logging -import subprocess -from pathlib import Path - -import aiohttp -from nio import ( - AsyncClient, - JoinResponse, -) - -from matrix_bot.gitea import ( - GiteaData, -) - -from .locked_open import read_locked_file, write_locked_file -from .matrix import MatrixData, send_message -from .openai import create_jsonl_data, upload_and_process_file - -log = logging.getLogger(__name__) - - -def last_ndays_to_today(ndays: int) -> (str, str): - # Get today's date - today = datetime.datetime.now() - - # Calculate the date one week ago - last_week = today - datetime.timedelta(days=ndays) - - # Format both dates to "YYYY-MM-DD" - todate = today.strftime("%Y-%m-%d") - fromdate = last_week.strftime("%Y-%m-%d") - - return (fromdate, todate) - - -def write_file_with_date_prefix( - content: str, directory: Path, *, ndays: int, suffix: str -) -> Path: - """ - Write content to a file with the current date as filename prefix. - - :param content: The content to write to the file. - :param directory: The directory where the file will be saved. - :return: The path to the created file. - """ - # Ensure the directory exists - directory.mkdir(parents=True, exist_ok=True) - - # Get the current date - fromdate, todate = last_ndays_to_today(ndays) - - # Create the filename - filename = f"{fromdate}__{todate}_{suffix}.txt" - file_path = directory / filename - - # Write the content to the file - with open(file_path, "w") as file: - file.write(content) - - return file_path - - -async def git_pull(repo_path: Path) -> None: - cmd = ["git", "pull"] - process = await asyncio.create_subprocess_exec( - *cmd, - cwd=str(repo_path), - ) - await process.wait() - - -async def git_log(repo_path: str, ndays: int) -> str: - cmd = [ - "git", - "log", - f"--since={ndays} days ago", - "--pretty=format:%h - %an, %ar : %s", - "--stat", - "--patch", - ] - process = await asyncio.create_subprocess_exec( - *cmd, - cwd=repo_path, - stdout=asyncio.subprocess.PIPE, - stderr=asyncio.subprocess.PIPE, - ) - stdout, stderr = await process.communicate() - - if process.returncode != 0: - raise Exception( - f"Command '{' '.join(cmd)}' failed with exit code {process.returncode}" - ) - - return stdout.decode() - - -async def changelog_bot( - client: AsyncClient, - http: aiohttp.ClientSession, - matrix: MatrixData, - gitea: GiteaData, - data_dir: Path, -) -> None: - last_run_path = data_dir / "last_changelog_run.json" - last_run = read_locked_file(last_run_path) - - if last_run == {}: - fromdate, todate = last_ndays_to_today(matrix.changelog_frequency) - last_run = { - "fromdate": fromdate, - "todate": todate, - "ndays": matrix.changelog_frequency, - } - log.debug(f"First run. Setting last_run to {last_run}") - today = datetime.datetime.now() - today_weekday = today.strftime("%A") - if today_weekday != matrix.publish_day: - log.debug(f"Changelog not due yet. Due on {matrix.publish_day}") - return - else: - last_date = datetime.datetime.strptime(last_run["todate"], "%Y-%m-%d") - today = datetime.datetime.now() - today_weekday = today.strftime("%A") - delta = datetime.timedelta(days=matrix.changelog_frequency) - if today - last_date <= delta: - log.debug(f"Changelog not due yet. Due in {delta.days} days") - return - elif today_weekday != matrix.publish_day: - log.debug(f"Changelog not due yet. Due on {matrix.publish_day}") - return - - # If you made a new room and haven't joined as that user, you can use - room: JoinResponse = await client.join(matrix.review_room) - - if not room.transport_response.ok: - log.error("This can happen if the room doesn't exist or the bot isn't invited") - raise Exception(f"Failed to join room {room}") - - repo_path = data_dir / gitea.repo - - if not repo_path.exists(): - cmd = [ - "git", - "clone", - f"{gitea.url}/{gitea.owner}/{gitea.repo}.git", - gitea.repo, - ] - subprocess.run(cmd, cwd=data_dir, check=True) - - # git pull - await git_pull(repo_path) - - # git log - diff = await git_log(repo_path, matrix.changelog_frequency) - - fromdate, todate = last_ndays_to_today(matrix.changelog_frequency) - log.info(f"Generating changelog from {fromdate} to {todate}") - - system_prompt = f""" -Generate a concise changelog for the past week from {fromdate} to {todate}, -focusing only on new features and summarizing bug fixes into a single entry. -Ensure the following: - -- Deduplicate entries -- Discard uninteresting changes -- Keep the summary as brief as possible -- Use present tense -The changelog is as follows: ---- - """ - - # Step 1: Create the JSONL file - jsonl_data = await create_jsonl_data(user_prompt=diff, system_prompt=system_prompt) - - # Step 2: Upload the JSONL file and process it - results = await upload_and_process_file(session=http, jsonl_data=jsonl_data) - - # Write the results to a file in the changelogs directory - result_file = write_file_with_date_prefix( - json.dumps(results, indent=4), - data_dir / "changelogs", - ndays=matrix.changelog_frequency, - suffix="result", - ) - log.info(f"LLM result written to: {result_file}") - - # Join responses together - all_changelogs = [] - for result in results: - choices = result["response"]["body"]["choices"] - changelog = "\n".join(choice["message"]["content"] for choice in choices) - all_changelogs.append(changelog) - full_changelog = "\n\n".join(all_changelogs) - - # Write the last run to the file - write_locked_file(last_run_path, last_run) - log.info(f"Changelog generated:\n{full_changelog}") - - await send_message(client, room, full_changelog) diff --git a/pkgs/matrix-bot/matrix_bot/custom_logger.py b/pkgs/matrix-bot/matrix_bot/custom_logger.py deleted file mode 100644 index 4bd2b3cd..00000000 --- a/pkgs/matrix-bot/matrix_bot/custom_logger.py +++ /dev/null @@ -1,97 +0,0 @@ -import inspect -import logging -from collections.abc import Callable -from pathlib import Path -from typing import Any - -grey = "\x1b[38;20m" -yellow = "\x1b[33;20m" -red = "\x1b[31;20m" -bold_red = "\x1b[31;1m" -green = "\u001b[32m" -blue = "\u001b[34m" - - -def get_formatter(color: str) -> Callable[[logging.LogRecord, bool], logging.Formatter]: - def myformatter( - record: logging.LogRecord, with_location: bool - ) -> logging.Formatter: - reset = "\x1b[0m" - - try: - filepath = Path(record.pathname).resolve() - filepath = Path("~", filepath.relative_to(Path.home())) - except Exception: - filepath = Path(record.pathname) - - if not with_location: - return logging.Formatter(f"{color}%(levelname)s{reset}: %(message)s") - - return logging.Formatter( - f"{color}%(levelname)s{reset}: %(message)s\nLocation: {filepath}:%(lineno)d::%(funcName)s\n" - ) - - return myformatter - - -FORMATTER = { - logging.DEBUG: get_formatter(blue), - logging.INFO: get_formatter(green), - logging.WARNING: get_formatter(yellow), - logging.ERROR: get_formatter(red), - logging.CRITICAL: get_formatter(bold_red), -} - - -class CustomFormatter(logging.Formatter): - def __init__(self, log_locations: bool) -> None: - super().__init__() - self.log_locations = log_locations - - def format(self, record: logging.LogRecord) -> str: - return FORMATTER[record.levelno](record, self.log_locations).format(record) - - -class ThreadFormatter(logging.Formatter): - def format(self, record: logging.LogRecord) -> str: - return FORMATTER[record.levelno](record, False).format(record) - - -def get_caller() -> str: - frame = inspect.currentframe() - if frame is None: - return "unknown" - caller_frame = frame.f_back - if caller_frame is None: - return "unknown" - caller_frame = caller_frame.f_back - if caller_frame is None: - return "unknown" - frame_info = inspect.getframeinfo(caller_frame) - - try: - filepath = Path(frame_info.filename).resolve() - filepath = Path("~", filepath.relative_to(Path.home())) - except Exception: - filepath = Path(frame_info.filename) - - ret = f"{filepath}:{frame_info.lineno}::{frame_info.function}" - return ret - - -def setup_logging(level: Any, root_log_name: str = __name__.split(".")[0]) -> None: - # Get the root logger and set its level - main_logger = logging.getLogger(root_log_name) - main_logger.setLevel(level) - - # Create and add the default handler - default_handler = logging.StreamHandler() - - # Create and add your custom handler - default_handler.setLevel(level) - default_handler.setFormatter(CustomFormatter(str(level) == str(logging.DEBUG))) - main_logger.addHandler(default_handler) - - # Set logging level for other modules used by this module - logging.getLogger("asyncio").setLevel(logging.INFO) - logging.getLogger("httpx").setLevel(level=logging.WARNING) diff --git a/pkgs/matrix-bot/matrix_bot/gitea.py b/pkgs/matrix-bot/matrix_bot/gitea.py deleted file mode 100644 index 470ba803..00000000 --- a/pkgs/matrix-bot/matrix_bot/gitea.py +++ /dev/null @@ -1,88 +0,0 @@ -import logging - -log = logging.getLogger(__name__) - - -from dataclasses import dataclass -from enum import Enum - -import aiohttp - - -@dataclass -class GiteaData: - url: str - owner: str - repo: str - access_token: str | None = None - - -def endpoint_url(gitea: GiteaData, endpoint: str) -> str: - return f"{gitea.url}/api/v1/repos/{gitea.owner}/{gitea.repo}/{endpoint}" - - -async def fetch_repo_labels( - gitea: GiteaData, - session: aiohttp.ClientSession, -) -> list[dict]: - """ - Fetch labels from a Gitea repository. - - Returns: - list: List of labels in the repository. - """ - url = endpoint_url(gitea, "labels") - headers = {"Accept": "application/vnd.github.v3+json"} - if gitea.access_token: - headers["Authorization"] = f"token {gitea.access_token}" - - async with session.get(url, headers=headers) as response: - if response.status == 200: - labels = await response.json() - return labels - else: - # You may want to handle different statuses differently - raise Exception( - f"Failed to fetch labels: {response.status}, {await response.text()}" - ) - - -class PullState(Enum): - OPEN = "open" - CLOSED = "closed" - ALL = "all" - - -async def fetch_pull_requests( - gitea: GiteaData, - session: aiohttp.ClientSession, - *, - limit: int, - state: PullState, - label_ids: list[int] = [], -) -> list[dict]: - """ - Fetch pull requests from a Gitea repository. - - Returns: - list: List of pull requests. - """ - # You can use the same pattern as fetch_repo_labels - url = endpoint_url(gitea, "pulls") - params = { - "state": state.value, - "sort": "recentupdate", - "limit": limit, - "labels": label_ids, - } - headers = {"accept": "application/json"} - - async with session.get(url, params=params, headers=headers) as response: - if response.status == 200: - labels = await response.json() - return labels - else: - # You may want to handle different statuses differently - raise Exception( - f"Failed to fetch labels: {response.status}, {await response.text()}" - ) diff --git a/pkgs/matrix-bot/matrix_bot/locked_open.py b/pkgs/matrix-bot/matrix_bot/locked_open.py deleted file mode 100644 index 64b2b916..00000000 --- a/pkgs/matrix-bot/matrix_bot/locked_open.py +++ /dev/null @@ -1,31 +0,0 @@ -import fcntl -import json -from collections.abc import Generator -from contextlib import contextmanager -from pathlib import Path -from typing import Any - - -@contextmanager -def locked_open(filename: str | Path, mode: str = "r") -> Generator: - """ - This is a context manager that provides an advisory write lock on the file specified by `filename` when entering the context, and releases the lock when leaving the context. The lock is acquired using the `fcntl` module's `LOCK_EX` flag, which applies an exclusive write lock to the file. - """ - with open(filename, mode) as fd: - fcntl.flock(fd, fcntl.LOCK_EX) - yield fd - fcntl.flock(fd, fcntl.LOCK_UN) - - -def write_locked_file(path: Path, data: dict[str, Any]) -> None: - with locked_open(path, "w+") as f: - f.write(json.dumps(data, indent=4)) - - -def read_locked_file(path: Path) -> dict[str, Any]: - if not path.exists(): - return {} - with locked_open(path, "r") as f: - content: str = f.read() - parsed: dict[str, Any] = json.loads(content) - return parsed diff --git a/pkgs/matrix-bot/matrix_bot/main.py b/pkgs/matrix-bot/matrix_bot/main.py deleted file mode 100644 index a0878af6..00000000 --- a/pkgs/matrix-bot/matrix_bot/main.py +++ /dev/null @@ -1,50 +0,0 @@ -import asyncio -import logging -from pathlib import Path - -import aiohttp - -log = logging.getLogger(__name__) - -from nio import AsyncClient, ClientConfig, ProfileGetAvatarResponse, RoomMessageText - -from .changelog_bot import changelog_bot -from .gitea import GiteaData -from .matrix import MatrixData, set_avatar, upload_image -from .review_bot import message_callback, review_requested_bot - - -async def bot_main( - matrix: MatrixData, - gitea: GiteaData, - data_dir: Path, -) -> None: - # Setup client configuration to handle encryption - client_config = ClientConfig( - encryption_enabled=False, - ) - - log.info(f"Connecting to {matrix.server} as {matrix.user}") - client = AsyncClient(matrix.server, matrix.user, config=client_config) - client.add_event_callback(message_callback, RoomMessageText) - - log.info(await client.login(matrix.password)) - - avatar: ProfileGetAvatarResponse = await client.get_avatar() - if not avatar.avatar_url: - mxc_url = await upload_image(client, matrix.avatar) - log.info(f"Uploaded avatar to {mxc_url}") - await set_avatar(client, mxc_url) - else: - log.info(f"Bot already has an avatar {avatar.avatar_url}") - - try: - async with aiohttp.ClientSession() as session: - while True: - await changelog_bot(client, session, matrix, gitea, data_dir) - await review_requested_bot(client, session, matrix, gitea, data_dir) - await asyncio.sleep(60 * 5) - except Exception as e: - log.exception(e) - finally: - await client.close() diff --git a/pkgs/matrix-bot/matrix_bot/matrix.py b/pkgs/matrix-bot/matrix_bot/matrix.py deleted file mode 100644 index b35bbdb5..00000000 --- a/pkgs/matrix-bot/matrix_bot/matrix.py +++ /dev/null @@ -1,88 +0,0 @@ -import logging -from pathlib import Path - -log = logging.getLogger(__name__) -from dataclasses import dataclass - -from markdown2 import markdown -from nio import ( - AsyncClient, - JoinedMembersResponse, - JoinResponse, - ProfileSetAvatarResponse, - RoomMember, - RoomSendResponse, - UploadResponse, -) - - -async def upload_image(client: AsyncClient, image_path: str) -> str: - with open(image_path, "rb") as image_file: - response: UploadResponse - response, _ = await client.upload(image_file, content_type="image/png") - if not response.transport_response.ok: - raise Exception(f"Failed to upload image {response}") - return response.content_uri # This is the MXC URL - - -async def set_avatar(client: AsyncClient, mxc_url: str) -> None: - response: ProfileSetAvatarResponse - response = await client.set_avatar(mxc_url) - if not response.transport_response.ok: - raise Exception(f"Failed to set avatar {response}") - - -async def get_room_members(client: AsyncClient, room: JoinResponse) -> list[RoomMember]: - users: JoinedMembersResponse = await client.joined_members(room.room_id) - - if not users.transport_response.ok: - raise Exception(f"Failed to get users {users}") - return users.members - - -async def send_message( - client: AsyncClient, - room: JoinResponse, - message: str, - user_ids: list[str] | None = None, -) -> None: - """ - Send a message in a Matrix room, optionally mentioning users. - """ - - # If user_ids are provided, format the message to mention them - formatted_message = markdown(message) - if user_ids: - mention_list = ", ".join( - [ - f"{user_id}" - for user_id in user_ids - ] - ) - formatted_message = f"{mention_list}: {formatted_message}" - - content = { - "msgtype": "m.text" if user_ids else "m.notice", - "format": "org.matrix.custom.html", - "body": message, - "formatted_body": formatted_message, - } - - res: RoomSendResponse = await client.room_send( - room_id=room.room_id, message_type="m.room.message", content=content - ) - - if not res.transport_response.ok: - raise Exception(f"Failed to send message {res}") - - -@dataclass -class MatrixData: - server: str - user: str - avatar: Path - password: str - changelog_room: str - review_room: str - changelog_frequency: int - publish_day: str diff --git a/pkgs/matrix-bot/matrix_bot/openai.py b/pkgs/matrix-bot/matrix_bot/openai.py deleted file mode 100644 index 641301b3..00000000 --- a/pkgs/matrix-bot/matrix_bot/openai.py +++ /dev/null @@ -1,123 +0,0 @@ -import asyncio -import json -import logging -import os - -import aiohttp - -log = logging.getLogger(__name__) - -# The URL to which the request is sent -url: str = "https://api.openai.com/v1/chat/completions" - - -def api_key() -> str: - if "OPENAI_API_KEY" not in os.environ: - raise Exception("OPENAI_API_KEY not set. Please set it in your environment.") - return os.environ["OPENAI_API_KEY"] - - -from typing import Any - - -async def create_jsonl_data( - *, - user_prompt: str, - system_prompt: str, - model: str = "gpt-4o", - max_tokens: int = 1000, -) -> bytes: - summary_request = { - "custom_id": "request-1", - "method": "POST", - "url": "/v1/chat/completions", - "body": { - "model": model, - "messages": [ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": user_prompt}, - ], - "max_tokens": max_tokens, - }, - } - - return json.dumps(summary_request).encode("utf-8") - - -async def upload_and_process_file( - *, session: aiohttp.ClientSession, jsonl_data: bytes, api_key: str = api_key() -) -> dict[str, Any]: - """ - Upload a JSONL file to OpenAI's Batch API and process it asynchronously. - """ - - upload_url = "https://api.openai.com/v1/files" - headers = { - "Authorization": f"Bearer {api_key}", - } - data = aiohttp.FormData() - data.add_field( - "file", jsonl_data, filename="changelog.jsonl", content_type="application/jsonl" - ) - data.add_field("purpose", "batch") - - async with session.post(upload_url, headers=headers, data=data) as response: - if response.status != 200: - raise Exception(f"File upload failed with status code {response.status}") - upload_response = await response.json() - file_id = upload_response.get("id") - - if not file_id: - raise Exception("File ID not returned from upload") - - # Step 2: Create a batch using the uploaded file ID - batch_url = "https://api.openai.com/v1/batches" - batch_data = { - "input_file_id": file_id, - "endpoint": "/v1/chat/completions", - "completion_window": "24h", - } - - async with session.post(batch_url, headers=headers, json=batch_data) as response: - if response.status != 200: - raise Exception(f"Batch creation failed with status code {response.status}") - batch_response = await response.json() - batch_id = batch_response.get("id") - - if not batch_id: - raise Exception("Batch ID not returned from creation") - - # Step 3: Check the status of the batch until completion - status_url = f"https://api.openai.com/v1/batches/{batch_id}" - - while True: - async with session.get(status_url, headers=headers) as response: - if response.status != 200: - raise Exception( - f"Failed to check batch status with status code {response.status}" - ) - status_response = await response.json() - status = status_response.get("status") - if status in ["completed", "failed", "expired"]: - break - await asyncio.sleep(10) # Wait before checking again - - if status != "completed": - raise Exception(f"Batch processing failed with status: {status}") - - # Step 4: Retrieve the results - output_file_id = status_response.get("output_file_id") - output_url = f"https://api.openai.com/v1/files/{output_file_id}/content" - - async with session.get(output_url, headers=headers) as response: - if response.status != 200: - raise Exception( - f"Failed to retrieve batch results with status code {response.status}" - ) - - # Read content as text - content = await response.text() - - # Parse the content as JSONL - results = [json.loads(line) for line in content.splitlines()] - return results diff --git a/pkgs/matrix-bot/matrix_bot/review_bot.py b/pkgs/matrix-bot/matrix_bot/review_bot.py deleted file mode 100644 index 9797afe1..00000000 --- a/pkgs/matrix-bot/matrix_bot/review_bot.py +++ /dev/null @@ -1,90 +0,0 @@ -import logging - -log = logging.getLogger(__name__) -import datetime -import time -from pathlib import Path - -import aiohttp -from nio import ( - AsyncClient, - JoinResponse, - MatrixRoom, - RoomMessageText, -) - -from matrix_bot.gitea import ( - GiteaData, - PullState, - fetch_pull_requests, -) - -from .locked_open import read_locked_file, write_locked_file -from .matrix import MatrixData, get_room_members, send_message - - -async def message_callback(room: MatrixRoom, event: RoomMessageText) -> None: - log.debug( - f"Message received in room {room.display_name}\n" - f"{room.user_name(event.sender)} | {event.body}" - ) - - -async def review_requested_bot( - client: AsyncClient, - http: aiohttp.ClientSession, - matrix: MatrixData, - gitea: GiteaData, - data_dir: Path, -) -> None: - # If you made a new room and haven't joined as that user, you can use - room: JoinResponse = await client.join(matrix.review_room) - - if not room.transport_response.ok: - log.error("This can happen if the room doesn't exist or the bot isn't invited") - raise Exception(f"Failed to join room {room}") - - # Get the members of the room - users = await get_room_members(client, room) - - # Fetch the pull requests - tstart = time.time() - pulls = await fetch_pull_requests(gitea, http, limit=50, state=PullState.ALL) - - # Read the last updated pull request - ping_hist_path = data_dir / "last_review_run.json" - ping_hist = read_locked_file(ping_hist_path) - - # Check if the pull request is mergeable and needs review - # and if the pull request is newer than the last updated pull request - for pull in pulls: - requested_reviewers = pull["requested_reviewers"] - pid = str(pull["id"]) - if requested_reviewers and pull["mergeable"]: - last_time_updated = ping_hist.get(pid, {}).get( - "updated_at", datetime.datetime.min.isoformat() - ) - if ping_hist == {} or pull["updated_at"] > last_time_updated: - ping_hist[pid] = pull - else: - continue - - # Check if the requested reviewers are in the room - requested_reviewers = [r["login"].lower() for r in requested_reviewers] - ping_users = [] - for user in users: - if user.display_name.lower() in requested_reviewers: - ping_users.append(user.user_id) - - # Send a message to the room and mention the users - log.info(f"Pull request {pull['title']} needs review") - message = f"Review Requested:\n[{pull['title']}]({pull['html_url']})" - await send_message(client, room, message, user_ids=ping_users) - - # Write the new last updated pull request - write_locked_file(ping_hist_path, ping_hist) - - # Time taken - tend = time.time() - tdiff = round(tend - tstart) - log.debug(f"Time taken: {tdiff}s") diff --git a/pkgs/matrix-bot/pyproject.toml b/pkgs/matrix-bot/pyproject.toml deleted file mode 100644 index e94402b7..00000000 --- a/pkgs/matrix-bot/pyproject.toml +++ /dev/null @@ -1,59 +0,0 @@ -[build-system] -requires = ["setuptools"] -build-backend = "setuptools.build_meta" - -[project] -name = "matrix-bot" -description = "matrix bot for release messages from git commits" -dynamic = ["version"] -scripts = { mbot = "matrix_bot:main" } -license = {text = "MIT"} - -[project.urls] -Homepage = "https://clan.lol/" -Documentation = "https://docs.clan.lol/" -Repository = "https://git.clan.lol/clan/clan-core" - -[tool.setuptools.packages.find] -exclude = ["result"] - -[tool.setuptools.package-data] -matrix_bot = ["py.typed"] - -[tool.pytest.ini_options] -testpaths = "tests" -faulthandler_timeout = 60 -log_level = "DEBUG" -log_format = "%(levelname)s: %(message)s\n %(pathname)s:%(lineno)d::%(funcName)s" -addopts = "--cov . --cov-report term --cov-report html:.reports/html --no-cov-on-fail --durations 5 --color=yes --new-first" # Add --pdb for debugging -norecursedirs = "tests/helpers" -markers = ["impure", "with_core"] - -[tool.mypy] -python_version = "3.11" -warn_redundant_casts = true -disallow_untyped_calls = true -disallow_untyped_defs = true -no_implicit_optional = true - -[[tool.mypy.overrides]] -module = "argcomplete.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "ipdb.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "pytest.*" -ignore_missing_imports = true - -[[tool.mypy.overrides]] -module = "setuptools.*" -ignore_missing_imports = true - -[tool.ruff] -target-version = "py311" -line-length = 88 -lint.select = [ "E", "F", "I", "U", "N", "RUF", "ANN", "A" ] -lint.ignore = ["E501", "E402", "E731", "ANN101", "ANN401", "A003"] diff --git a/pkgs/matrix-bot/shell.nix b/pkgs/matrix-bot/shell.nix deleted file mode 100644 index 85d32492..00000000 --- a/pkgs/matrix-bot/shell.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ - matrix-bot, - mkShell, - ruff, - python3, -}: -let - devshellTestDeps = - matrix-bot.passthru.testDependencies - ++ (with python3.pkgs; [ - rope - setuptools - wheel - ipdb - pip - ]); -in -mkShell { - buildInputs = [ ruff ] ++ devshellTestDeps; - - PYTHONBREAKPOINT = "ipdb.set_trace"; - - shellHook = '' - export GIT_ROOT="$(git rev-parse --show-toplevel)" - export PKG_ROOT="$GIT_ROOT/pkgs/matrix-bot" - - # Add clan command to PATH - export PATH="$PKG_ROOT/bin":"$PATH" - ''; -}