-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsend_messages.py
88 lines (70 loc) · 3.01 KB
/
send_messages.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import logging
from random import randint
import requests
import telebot
from telebot import apihelper
import sqlite3
from settings import GITLAB_TOKEN, BOT_API_KEY, PROXY, DB_PATH, PROJECT_IDS, GITLAB_URL, NUMBER_OF_REVIEWERS
logging.basicConfig(filename='logs.log', level=logging.INFO, format='[%(asctime)s] %(message)s')
logging.getLogger().addHandler(logging.StreamHandler())
connection = sqlite3.connect(DB_PATH, check_same_thread=False)
cursor = connection.cursor()
apihelper.proxy = {"https": PROXY}
bot = telebot.TeleBot(token=BOT_API_KEY)
def define_approvers():
cursor.execute("SELECT * FROM developer")
developers = cursor.fetchall()
if len(developers) < NUMBER_OF_REVIEWERS:
logging.info("Not enough developers in DB")
exit(1)
projects = PROJECT_IDS
request_params = {"private_token": GITLAB_TOKEN, "state": "opened"}
approvers = {chat_id: {"username": gitlab_username} for chat_id, _, gitlab_username in developers}
for project_id in projects:
url = "{}projects/{}/merge_requests".format(GITLAB_URL, project_id)
response = requests.get(url, params=request_params).json()
for merge_request in response:
if merge_request.get("work_in_progress"):
continue
approvers = assign_merge_request(developers, merge_request, approvers)
return approvers
def send_messages(approvers):
for chat_id, user_info in approvers.items():
username = user_info.get("username")
messages = user_info.get("messages")
if not messages:
continue
links = [x.get("web_url") for x in messages]
message = "\n".join(links)
message = "Review:\n{}".format(message)
bot.send_message(chat_id, message)
logging.info('{} has received {}'.format(username, ', '.join(links)))
def assign_merge_request(developers, merge_request, users):
approvers = []
for _ in range(NUMBER_OF_REVIEWERS):
chat_id, username, counter = None, None, 0
while not chat_id or is_correct_reviewer(username, merge_request, chat_id, approvers):
chat_id = developers[randint(0, len(developers) - 1)][0]
username = users[chat_id].get("username")
counter += 1
if counter > 10:
logging.info("Not enough developers in DB")
exit(1)
users = update_users(users, chat_id, merge_request)
approvers.append(chat_id)
return users
def update_users(users, chat_id, merge_request):
user = users.get(chat_id)
if user.get("messages"):
messages = user.get("messages")
messages.append(merge_request)
user["messages"] = messages
else:
user["messages"] = [merge_request]
users[chat_id] = user
return users
def is_correct_reviewer(username, merge_request, chat_id, assined_reviewers):
return username == merge_request.get("author", {}).get("username") or chat_id in assined_reviewers
if __name__ == "__main__":
approvers = define_approvers()
send_messages(approvers)