Compare commits

...

21 Commits

Author SHA1 Message Date
Lephenixnoir bc9b9a5829
use correct number of total commits for large pushes 2024-03-18 22:56:54 +01:00
Lephenixnoir 6ff873fb9f
ignore mirror sync events 2023-10-09 17:21:01 +02:00
Lephenixnoir 80c0585aff
use new channel name 2023-09-20 23:55:50 +02:00
Lephenixnoir 431d91ab9e
ignore repository deletions 2023-03-25 23:45:28 +01:00
Darks 2fad6de2b6
Manage PR rejected as well 2022-12-18 00:03:10 +01:00
Darks c5ff33425c
Fixed bot 2022-12-17 23:58:13 +01:00
Darks ea63163fd8
Manage PR review messages 2022-12-17 23:53:46 +01:00
Lephenixnoir 3608e1ec71
only ignore push-creations with no commits for branches 2022-05-16 20:33:39 +01:00
Darks 6060c10715
README update 2022-04-13 23:07:52 +02:00
Darks 303a11c062
updated service file to add a bit more log information 2022-04-13 22:10:36 +02:00
Darks 7370986ddd
use username/password instead of shitty cookie 2022-04-13 22:04:51 +02:00
Darks 9e4fb19b86
loglevel from environment variable 2022-04-13 21:49:00 +02:00
Louis Gatin 7c719aa48c updated readme
I need a dummy commit to test in prod :-°
2022-04-13 10:25:50 +02:00
Louis Gatin 6a10e5744f add some logging when post fails 2022-04-13 10:21:30 +02:00
Lephenixnoir 98e19c407d
ignore branch-creating pushes with no commits 2022-03-11 16:11:12 +00:00
Lephenixnoir 47fea7b77d
add branch names in push messages 2021-12-31 11:20:08 +01:00
Lephenixnoir bdb7805d40
rename secrets.py to gb_secrets.py
A new Python 3.9 module "secrets" has been added, which breaks the
import command that is supposed to load the local file.
2021-06-06 15:45:19 +02:00
Lephenixnoir 5c07359b35
ignore PR editions 2021-05-02 08:55:13 +02:00
Lephenixnoir e13d483436
ignore issue assignments and label changes 2021-04-28 18:40:59 +02:00
Lephenixnoir 12631524e9
reverse hiding new issue comments by accident 2021-03-23 14:09:18 +01:00
Lephenixnoir b9ddbe6c43
improve PR merge pushes by detecting commit messages 2021-03-22 22:38:08 +01:00
5 changed files with 95 additions and 23 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
__pycache__/
secrets.py
gb_secrets.py

View File

@ -1,11 +1,12 @@
## GLaDOS bot
Ce bot recoit des requêtes Gitea, les parse et poste des messages en tant que GLaDOS sur la shoutbox.
Ce bot recoit des requêtes Gitea, les parse et poste des messages en tant que `Gitea` sur la shoutbox.
## Configuration du backend
1. Cloner le dépot dans `/home/pc/gitea-bot/`
2. Copier le cookie de session de GLaDOS dans `secrets.py`
2. Copier les identifiants de `Gitea` dans `gb_secrets.py` (`credentials = {"username":"Gitea", "password":"P@ssw0rd"}`)
3. Placer `gitea-bot.service` dans `/etc/systemd/system/`
4. Démarrer le service `gitea-bot`
@ -13,13 +14,14 @@ Ce bot recoit des requêtes Gitea, les parse et poste des messages en tant que G
# su pc
$ cd ~
$ git clone gitea@gitea.planet-casio.com:devs/Gitea-bot.git gitea-bot
$ vim gitea-bot/secrets.py
$ vim gitea-bot/gb_secrets.py
$ exit
# cp /home/pc/gitea-bot/gitea-bot.service /etc/systemd/system/
# systemctl enable --now gitea-bot
```
En soit le cookie peut être celui de n'importe quel membre ayant le droit de causer sur la shout. Par contre ça ne sera plus GLaDOS qui causera.
En soit le cookie peut être celui de n'importe quel membre ayant le droit de causer sur la shout. Par contre ça ne sera plus `Gitea` qui causera.
## Configuration de Gitea
@ -40,6 +42,7 @@ Sélectionner des éléments qui déclencheront des évènements, vérifier que
Les derniers évènements sont affichés sous le formulaire.
## Traiter de nouveaux évènements
La documentation sur les events est disponible [ici](https://docs.gitea.io/en-us/webhooks/).
@ -48,6 +51,7 @@ Gitea logge les événements récents dans les paramètres du webhook dans le pa
Le script actuel est pas fou, n'hésitez pas à proposer des améliorations! :)
## Tester les modifications en local
Lancer le serveur de test avec `flask run` ; les requêtes enregistrées par Gitea peuvent être envoyées avec curl.
@ -56,6 +60,18 @@ Lancer le serveur de test avec `flask run` ; les requêtes enregistrées par Git
curl http://127.0.0.1:5000 -X POST -H 'X-Gitea-Event:push' -H 'Content-Type: application/json' -d "$(cat logged-push-event.json)"
```
## Modifier la verbosité des logs
Vous pouvez changer le niveau de verbosité des logs via la variable denvironement `LOGLEVEL` :
- `critical`
- `error`
- `warning`
- `info` (défaut)
- `debug`
## Appliquer des modifications
```
@ -65,3 +81,8 @@ $ git pull
$ exit
# systemctl restart gitea-bot
```
## En cas de soucis
Si le bot ne fonctionne plus sans modification apparente, vous pouvez essayer de redémarrer le service. Cela réinitialisera la session et ses cookies dauthentification.

85
app.py
View File

@ -1,8 +1,15 @@
from flask import Flask, request
from secrets import cookie
import requests as r
from gb_secrets import credentials
import logging, requests, os
import re
LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper()
logging.basicConfig(level=LOGLEVEL)
app = Flask(__name__)
session = requests.Session()
session.post("https://www.planet-casio.com/Fr/compte",
data=credentials)
def make_url_user(user):
return f"[url=https://gitea.planet-casio.com/{user['username']}]{user['username']}[/url]"
@ -12,39 +19,58 @@ def make_url_repository(repository):
@app.route("/", methods=["GET", "POST"])
def main():
global session
data = request.json
event = request.headers['X-Gitea-Event']
msg = None
if data["repository"]["private"]:
if data["repository"]["private"] or data["repository"]["mirror"]:
return "IGN"
url_repository = make_url_repository(data["repository"])
if event == "push" and data["commits"] != []:
# Heuristic to handle pull request merges by detecting default merge message
RE_MERGE = r"^Merge pull request '(.+)' \(#([0-9]+)\)"#from .* into"
m = re.match(RE_MERGE, data["commits"][0]["message"])
if len(data["commits"]) > 1 and m:
pr_url = data["repository"]["html_url"] + "/pulls/" + m[2]
pr_url = f"[url={pr_url}]{m[1]}[/url]"
data["commits"] = data["commits"][1:]
else:
pr_url = None
commits = data["commits"]
commit_count = f"{len(commits)} commit{'s' if len(commits) > 1 else ''}"
total_commits = data.get("total_commits", len(commits))
commit_count = f"{total_commits} commit{'s' if total_commits > 1 else ''}"
message = "[inlinecode]" + commits[0]["message"].split('\n',1)[0] + "[/inlinecode]"
if len(commits) <= 1:
if total_commits <= 1:
others = ""
elif len(commits) == 2:
elif total_commits == 2:
others = " (et 1 autre commit)"
else:
others = f" (et {len(commits)-1} autres commits)"
others = f" (et {total_commits-1} autres commits)"
url_user = make_url_user(data['pusher'])
# Pull request merge
if pr_url:
msg = f"{url_user} a fusionné la PR {pr_url}: {message}{others}"
# Ref doesn't have a previous commit = new branch
if all(c == "0" for c in data["before"]) and data["ref"].startswith("refs/heads/"):
elif all(c == "0" for c in data["before"]) and data["ref"].startswith("refs/heads/"):
branch = data["ref"][11:]
url_branch = data["repository"]["html_url"] + f"/src/branch/{branch}"
url_branch = f"[url={url_branch}]{branch}[/url]"
msg = f"{url_user} a créé une nouvelle branche {url_branch} dans {url_repository} : {message}{others}"
# Pre-existing branch
else:
if data["ref"].startswith("refs/heads/"):
branch = " (branche " + data["ref"][11:] + ")"
else:
branch = ""
url_commits = f"[url={data['compare_url']}]{commit_count}[/url]"
msg = f"{url_user} a poussé {url_commits} dans {url_repository} : {message}{others}"
msg = f"{url_user} a poussé {url_commits} dans {url_repository}{branch} : {message}{others}"
if event == "push" and data["ref"].startswith("refs/tags/"):
url_user = make_url_user(data['pusher'])
@ -68,7 +94,7 @@ def main():
elif data['action'] == "edited":
msg = f"{url_user} a édité le ticket {url_issue} dans {url_repository}"
else:
msg = f"{url_user} a <{data['action']}> le ticket {url_issue} dans {url_repository}"
return "IGN"
if event == "issue_comment":
url_user = make_url_user(data['sender'])
@ -76,6 +102,8 @@ def main():
if data['action'] == "created":
msg = f"{url_user} a répondu au ticket {url_issue} dans {url_repository}"
else:
return "IGN"
if event == "pull_request" and data["action"] == "opened":
url_user = make_url_user(data["sender"])
@ -87,21 +115,37 @@ def main():
url_user = make_url_user(data['sender'])
msg = f"{url_user} a créé un nouveau dépôt {url_repository}"
if event == "repository" and data["action"] == "deleted":
return "IGN"
if event == "push" and all(c == '0' for c in data["after"]):
return "IGN"
if event == "pull_request" and data["action"] in ["assigned", "closed", "synchronized"]:
if event == "push" and not data["ref"].startswith("refs/tags/") \
and all(c == '0' for c in data["before"]) and data["commits"] == []:
return "IGN"
if event == "pull_request" and data["action"] in ["assigned", "closed", "synchronized", "edited"]:
return "IGN"
if event == "pull_request_approved" and data["action"] == "reviewed":
url_user = make_url_user(data['sender'])
url_pr = f"[url={data['pull_request']['url']}]{data['pull_request']['title']}[/url]"
msg = f"{url_user} a approuvé la PR {url_pr} dans {url_repository}"
if event == "pull_request_rejected" and data["action"] == "reviewed":
url_user = make_url_user(data['sender'])
url_pr = f"[url={data['pull_request']['url']}]{data['pull_request']['title']}[/url]"
msg = f"{url_user} a demandé des modifications sur la PR {url_pr} dans {url_repository}"
if event == "fork":
return "IGN"
if event == "create" and data["ref_type"] in ["tag", "branch"]:
return "IGN"
if event == "issue_comment":
return "IGN"
if event == "delete":
return "IGN"
@ -116,9 +160,14 @@ def main():
if msg:
msg = f"[gray][i]{msg}[/i][/gray]"
app.logger.warn(msg)
r.post("https://www.planet-casio.com/Fr/shoutbox/api/post",
data={"message": msg, "channel": "dev"}, cookies=cookie)
return "OK"
app.logger.info(msg)
r = session.post("https://www.planet-casio.com/Fr/shoutbox/api/post",
data={"message": msg, "channel": "projets"})
if r.status_code == 200:
return "OK"
else:
app.logger.warn(f"Error: {r.status_code}")
return f"ERR {r.status_code}"
return "ACK"

View File

@ -1,2 +1,3 @@
# A cookie for GLaDOS
cookie = {"planete_casio_session":"SomeSessionCookieFromGlados"}
credentials = None

View File

@ -5,6 +5,7 @@ After=network.target
[Service]
User=pc
WorkingDirectory=/home/pc/gitea-bot/
Environment="LOGLEVEL=info"
ExecStart=flask run
Restart=always