This commit is contained in:
Xander Bil 2024-09-26 21:45:47 +02:00
parent 610c7e95b5
commit d5e18b2360
No known key found for this signature in database
GPG key ID: EC9706B54A278598
7 changed files with 27 additions and 61 deletions

View file

@ -1,4 +1,2 @@
web: run:
python -m hug -f src/web.py python src/run.py
sync:
curl localhost:8000/sync-mattermost

View file

@ -9,16 +9,12 @@ selected_user = "my_username"
[mattermost.users.my_username] [mattermost.users.my_username]
name = "my_username" token = "..."
password = "..."
[codimd] [codimd]
server_url = "https://codimd.zeus.gent" server_url = "https://codimd.zeus.gent"
email = ""
password = ""
[gitea] [gitea]

View file

@ -1,9 +1,6 @@
tabulate tabulate
humanize humanize
colored colored
mattermostdriver mattermostdriver
hug
gitpython gitpython
giteapy giteapy

View file

@ -2,18 +2,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pprint as pp import pprint as pp
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime
from enum import Enum from enum import Enum
from time import sleep from typing import Dict
from typing import Dict, List
from colored import Style from colored import Style
from mattermostdriver import Driver from mattermostdriver import Driver
from tabulate import tabulate
from config import config from config import config
from mattermost_objects import MMChannelPosts, MMPost, MMUser from mattermost_objects import MMChannelPosts
from utils import humanize_date_difference, timer from utils import timer
pp = pp.PrettyPrinter(indent=2) pp = pp.PrettyPrinter(indent=2)
@ -28,19 +25,6 @@ class User(ABC):
def credentials_dict(self) -> dict: def credentials_dict(self) -> dict:
pass pass
class NormalUser(User):
def __init__(self, login_id, password):
self.login_id = login_id
self.password = password
def credentials_dict(self) -> dict:
return {"login_id": self.login_id, "password": self.password}
def __repr__(self):
return "User<name: {}, password: ******>".format(self.login_id)
class TokenUser(User): class TokenUser(User):
def __init__(self, token): def __init__(self, token):
self.token = token self.token = token
@ -60,8 +44,6 @@ def loadusers():
for name, data in config["mattermost"]["users"].items(): for name, data in config["mattermost"]["users"].items():
if "token" in data: if "token" in data:
usr = TokenUser(token=data["token"]) usr = TokenUser(token=data["token"])
elif "name" in data and "password" in data:
usr = NormalUser(login_id=data["name"], password=data["password"])
else: else:
print("Invalid user '{}' in toml file".format(name)) print("Invalid user '{}' in toml file".format(name))
exit(1) exit(1)
@ -76,7 +58,7 @@ def merge_dict(a: dict, b: dict) -> dict:
class MMApi(Driver): class MMApi(Driver):
def __init__(self, user: User = users["flynn"]): def __init__(self, user: User = users["zeusbot9000"]):
print(f"Initializing MMApi client for user {user}") print(f"Initializing MMApi client for user {user}")
Driver.__init__( Driver.__init__(
self, self,
@ -92,7 +74,7 @@ class MMApi(Driver):
self.login() self.login()
self.user_id = self.users.get_user(user_id="me")["id"] self.user_id = self.users.get_user(user_id="me")["id"]
self.team_id = self.teams.get_team_by_name("zeus")["id"] self.team_id = self.teams.get_team_by_name("zeus")["id"]
print(f" = Creating mattermost client") print(" = Creating mattermost client")
print(f" = - User: {self.user_id}") print(f" = - User: {self.user_id}")
print(f" = - Team: {self.team_id}") print(f" = - Team: {self.team_id}")
@ -154,7 +136,7 @@ class MMApi(Driver):
class ChannelApi(MMApi): class ChannelApi(MMApi):
def __init__(self, channel_name=None, channel_id=None, user=None): def __init__(self, channel_name=None, channel_id=None, user=None):
MMApi.__init__(self, user) MMApi.__init__(self, user)
assert channel_name != None or channel_id != None assert channel_name is not None or channel_id != None
if channel_name is not None: if channel_name is not None:
self.channel_id = self.get_channel_id(channel_name) self.channel_id = self.get_channel_id(channel_name)

View file

@ -5,7 +5,7 @@ from config import config
from mattermost_client import ChannelApi, MMApi from mattermost_client import ChannelApi, MMApi
def send_message(file_id, file_info, message): def send_message(file_info, message):
channel_id = file_info["originating_mm_post_channel_id"] channel_id = file_info["originating_mm_post_channel_id"]
post_id = file_info["originating_mm_post_id"] post_id = file_info["originating_mm_post_id"]
@ -34,13 +34,13 @@ def send_message(file_id, file_info, message):
) )
def report_newly_found_file(file_id, file_info): def report_newly_found_file(file_info):
git_url = f"https://{config['gitea']['server_url']}/{config['gitea']['remote_org']}/{config['gitea']['remote_repo']}" git_url = f"https://{config['gitea']['server_url']}/{config['gitea']['remote_org']}/{config['gitea']['remote_repo']}"
message = f"I found a new CodiMD file in this post! Making work of putting it on git :)\n - Requested location in the [drive]({git_url}): {file_info['metadata']['sync-to']}" message = f"I found a new CodiMD file in this post! Making work of putting it on git :)\n - Requested location in the [drive]({git_url}): {file_info['metadata']['sync-to']}"
send_message(file_id, file_info, message) send_message(file_info, message)
def report_newly_found_but_invalid_file(file_id, file_info): def report_newly_found_but_invalid_file(file_info):
message = """Hi there! :wave: message = """Hi there! :wave:
I'm your friendly neighbourhood document sync bot. I'm your friendly neighbourhood document sync bot.
I could synchronize this CodiMD file automatically to our Git DRIVE for safekeeping, but the necessary metadata block is not present. I could synchronize this CodiMD file automatically to our Git DRIVE for safekeeping, but the necessary metadata block is not present.
@ -53,4 +53,4 @@ Just add the following lines to your file, the location in your file is not impo
- sync-to: <a valid path on the DRIVE, for ex.: verslagen/21-22/2022-05-13.md> - sync-to: <a valid path on the DRIVE, for ex.: verslagen/21-22/2022-05-13.md>
::: :::
```""" ```"""
send_message(file_id, file_info, message) send_message(file_info, message)

View file

@ -5,7 +5,6 @@ import time
import traceback import traceback
from pprint import pprint from pprint import pprint
import hug
import requests import requests
import db import db
@ -79,13 +78,11 @@ def validate_downloaded_files(post_mattermost_hint=True):
if metadata is not None: if metadata is not None:
is_new_file, new_file_info = db.mark_file_valid(file_id, metadata) is_new_file, new_file_info = db.mark_file_valid(file_id, metadata)
if is_new_file: if is_new_file:
mattermost_communication.report_newly_found_file(file_id, new_file_info) print(f"new file found: {new_file_info["source_url"]}")
else: else:
changed, new_file_info = db.mark_file_invalid(file_id) changed, new_file_info = db.mark_file_invalid(file_id)
if changed and post_mattermost_hint: if changed and post_mattermost_hint:
mattermost_communication.report_newly_found_but_invalid_file( mattermost_communication.report_newly_found_but_invalid_file(new_file_info)
file_id, new_file_info
)
return db._load_db() return db._load_db()
@ -94,17 +91,14 @@ def sync_files_to_gitea():
repo, api_handler = sync.init_sync() repo, api_handler = sync.init_sync()
for file_id, file_info in db.get_files().items(): for file_id, file_info in db.get_files().items():
if file_info["valid"]: if file_info["valid"]:
local_file_path = file_info["local_file_path"]
sync_to = file_info["metadata"]["sync-to"]
try: try:
sync.sync_file(repo, api_handler, local_file_path, sync_to) sync.sync_file(repo, api_handler, file_info)
except Exception as e: except Exception as e:
print("Critical error: Failed to sync file to Gitea") print("Critical error: Failed to sync file to Gitea")
traceback.print_exc() traceback.print_exc()
@hug.get("/sync-mattermost") if __name__ == "__main__":
def sync_mattermost():
print() print()
print("=======================================") print("=======================================")
print("== Finding urls posted on mattermost ==") print("== Finding urls posted on mattermost ==")

View file

@ -2,15 +2,12 @@ from __future__ import print_function
import os import os
import pathlib import pathlib
import time
from pprint import pprint
import git import git
import giteapy import giteapy
from giteapy.rest import ApiException
import db
from config import config from config import config
import mattermost_communication
# https://docs.gitea.com/api/1.20/ # https://docs.gitea.com/api/1.20/
@ -71,7 +68,10 @@ def checkout_branch(repo, branch_name):
repo.remotes.origin.pull() repo.remotes.origin.pull()
def sync_file(repo, api_instance, path, sync_to): def sync_file(repo, api_instance, file_info):
path = file_info["local_file_path"]
sync_to = file_info["metadata"]["sync-to"]
branch_name = f"codimd-sync_{sync_to}" branch_name = f"codimd-sync_{sync_to}"
print(f"Starting sync of {path}") print(f"Starting sync of {path}")
clear_repo(repo) clear_repo(repo)
@ -83,9 +83,7 @@ def sync_file(repo, api_instance, path, sync_to):
) )
with open(f"{REPO_FOLDER}/{sync_to}", "w") as w: with open(f"{REPO_FOLDER}/{sync_to}", "w") as w:
w.write(r.read()) w.write(r.read())
print(repo.index.diff()) if repo.git.diff() or repo.untracked_files:
print(repo.untracked_files)
if repo.index.diff() or repo.untracked_files:
print(" Note has changes. Making a commit.") print(" Note has changes. Making a commit.")
repo.index.add([sync_to]) repo.index.add([sync_to])
repo.index.commit("Updating file with codimd version") repo.index.commit("Updating file with codimd version")
@ -122,6 +120,7 @@ def sync_file(repo, api_instance, path, sync_to):
title=f"[CodiMD sync] Add document {sync_to}", title=f"[CodiMD sync] Add document {sync_to}",
), ),
) )
mattermost_communication.report_newly_found_file(file_info)
else: else:
print(" Merge request was already open.") print(" Merge request was already open.")
else: else: