def process_step_4(message): cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor4 = dict(cursor3) for j in cursor4["token"]: cur.append(decoder(j)) if message.text in cur: try: gl = Gitlab('https://git.iu7.bmstu.ru/', private_token=message.text) gl.auth() username = gl.user.username db.token.find_one_and_update( { "id": encoder(str(message.chat.id)), "token": encoder(cur) }, {'$set': { "idGitLab": encoder(username) }}) except gitlab.GitlabAuthenticationError: st = open('./static/access_denied.webp', 'rb') bot.send_sticker(message.chat.id, st) bot.send_message( message.chat.id, "Произошла ошибка при авторизации в GitLab. Проверьте правильность токена", parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) else: bot.send_message(message.chat.id, "Такого TOKEN нет в твоем списке...", parse_mode="html", reply_markup=types.ReplyKeyboardRemove())
def send_reopen(self, receiver): message = "В проекте \"{0}\" пользователем {1} " \ "был переоткрыт merge request {2)".format(self.project_name, self.author_name, self.mg_title) try: bot.send_message(chat_id=decoder(receiver['id']), text=message) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_button(self, receiver): inline_item1 = types.InlineKeyboardButton('Merge Request', url=self.merge_request_url) inline_bt1 = types.InlineKeyboardMarkup() inline_bt1.add(inline_item1) try: bot.send_message(chat_id=decoder(receiver['id']), text="Более подробную информацию о мерж реквесте можно узнать, " "перейдя по ссылке.", reply_markup=inline_bt1) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_open(self, receiver, file): diff = "```" + str(file['diff']).replace("```", "\`\`\`") + "```" message = "Пользователь {0} отправил Вам " \ "запрос на слитие веток {1} и {2} " \ "в проекте {3}\n".format(self.author_name, self.target_branch, self.source_branch, self.project_name).replace("_", "\_") try: bot.send_message(chat_id=decoder(receiver['id']), text=message + diff, parse_mode="markdown") except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def process_step_1(message): if message.text == 'Ввод TOKEN': bot.register_next_step_handler(message, process_step_2) elif message.text == 'Выбор TOKEN': cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor4 = dict(cursor3) for j in cursor4["token"]: cur.append(decoder(j)) bot.send_message( message.chat.id, "Давай выберем, какой TOKEN нужно использовать. Вот список твоих TOKEN:\n" + '\n'.join(cur), parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) bot.register_next_step_handler(message, process_step_4) elif message.text == 'Удаление TOKEN': cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor4 = dict(cursor3) for j in cursor4["token"]: cur.append(decoder(j)) bot.send_message( message.chat.id, "Давай выберем, какой TOKEN нужно удалить. Вот список твоих TOKEN:\n" + '\n'.join(cur), parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) bot.register_next_step_handler(message, process_step_5) else: bot.send_message(message.chat.id, 'Странно, такой команды нет...', parse_mode="html", reply_markup=types.ReplyKeyboardRemove())
def process_step_5(message): if message.chat.username is None: name_user = str(message.chat.id) else: name_user = "******" + message.chat.username cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor4 = dict(cursor3) for j in cursor4["token"]: cur.append(decoder(j)) if message.text in cur: for j, i in enumerate(cur): if message.text == i: cur.pop(j) db.token.find_one_and_update({"id": encoder(str(message.chat.id))}, {'$set': { "token": encoder(cur) }}) bot.send_message(message.chat.id, "Ваш TOKEN ( " + message.text + " ) был удачно удален из нашей базы данных", parse_mode="html") if len(cur) != 0: item3 = types.KeyboardButton("Удаление TOKEN") markup1 = types.ReplyKeyboardMarkup(resize_keyboard=True) markup1.add(item3) bot.send_message( message.chat.id, "Могу предложить удалить еще TOKEN. Если надо, жми кнопочку", parse_mode="html", reply_markup=markup1) bot.register_next_step_handler(message, process_step_1) else: bot.send_message(message.chat.id, name_user + ", ты удалил все TOKEN", parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) else: bot.send_message(message.chat.id, "Такого TOKEN нет в твоем списке...", parse_mode="html", reply_markup=types.ReplyKeyboardRemove())
def process_step_2(message): cursor3 = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor4 = dict(cursor3) for j in cursor4["token"]: cur.append(decoder(j)) if message.text in cur: bot.send_message(message.chat.id, "Данный TOKEN уже есть в нашей базе данных", parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) else: cur.append(message.text) db.token.find_one_and_update({"id": encoder(str(message.chat.id))}, {'$set': { "token": encoder(cur) }}) bot.send_message(message.chat.id, "Ваш TOKEN был успешно добавлен в нашу базу данных 🎉", parse_mode="html", reply_markup=types.ReplyKeyboardRemove()) try: gl = Gitlab('https://git.iu7.bmstu.ru/', private_token=message.text) gl.auth() username = gl.user.username db.token.find_one_and_update( { "id": encoder(str(message.chat.id)), "token": encoder(cur) }, {'$set': { "idGitLab": encoder(username) }}) except gitlab.GitlabAuthenticationError: st4 = open('./static/access_denied.webp', 'rb') bot.send_sticker(message.chat.id, st4) bot.send_message( message.chat.id, "Произошла ошибка при авторизации в GitLab. Проверьте правильность токена", parse_mode="html", reply_markup=types.ReplyKeyboardRemove())
def send_others(self, receiver, result): message = "А так же еще изменения в {0} файлах".format(len(result['diffs']) - 1) try: bot.send_message(chat_id=decoder(receiver['id']), text=message) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_undefined(self, receiver): message = "В репозитории {0} произошло неопознанное событие".format(self.project_name) try: bot.send_message(chat_id=decoder(receiver['id']), text=message) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_new(self, receiver): message = "В Merge Request {0} произошло новое событие.".format(self.mg_title) try: bot.send_message(chat_id=decoder(receiver['id']), text=message) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_close(self, receiver): message = "Merge request {0} был закрыт.".format(self.mg_title) try: bot.send_message(chat_id=decoder(receiver['id']), text=message) except telebot.apihelper.ApiException: logging.error("The chat was not founded. It looks like a trouble with db :c")
def send_update(self, receiver): message = "В Merge Request {0} произошло новое событие.".format(self.mg_title) bot.send_message(chat_id=decoder(receiver['id']), text=message)
def get_repo_compare(self, private_key): # авторизуемся для каждого юзера по последнему токену gl = gitlab.Gitlab('https://git.iu7.bmstu.ru/', private_token=decoder(private_key['token'][-1])) # ['token'][-1] project = gl.projects.get(self.project_id) # находим проект return project.repository_compare(self.target_branch, self.source_branch)
def index(self): # raw_body = cherrypy.request.body.read() raw_json = cherrypy.request.json # получаем вебхук if raw_json[ 'object_kind'] == 'merge_request': # если вебхук вызван мержреквестом print(raw_json) # Парсинг вебхука ######################################################################## assignees_array = raw_json[ 'assignees'] # находим всем юзеров, заасаненных к мержреквесту project_name = raw_json['project']['name'] # название проекта project_id = raw_json['project']['id'] # id проекта source_branch = raw_json['object_attributes'][ 'source_branch'] # ветка, которую сливаем target_branch = raw_json['object_attributes'][ 'target_branch'] # ветка, в которую сливаем author_name = raw_json['user']['name'] # имя автора merge request merge_request_url = raw_json['object_attributes'][ 'url'] # адрес страницы merge request mg_title = raw_json['object_attributes'][ 'title'] # заголовок мерд реквеста try: action = raw_json['object_attributes']['action'] # действие except KeyError: action = None result = None ########################################################################################## for i in assignees_array: # для каждого пользователя private_key = db.token.find_one({ 'idGitLab': encoder(i['username']) }) # достаем ключ авторизации пользователя if private_key is None: print("Warning! No user was found to a merge request!") else: # авторизуемся для каждого юзера по последнему токену gl = gitlab.Gitlab( 'https://git.iu7.bmstu.ru/', private_token=decoder( private_key['token'][-1])) # ['token'][-1] project = gl.projects.get(project_id) # находим проект if action is not None: result = project.repository_compare( target_branch, source_branch) for receiver in db.token.find( {'idGitLab': encoder(i['username'])}): if action is not None and result: # для каждого телеграм аккаунта, прикрепленного к этому юзеру for j, file in enumerate(result['diffs']): if action == 'open' or action == 'merged': diff = "```" + str(file['diff']).replace( "```", "\`\`\`") + "```" message = "Пользователь {0} отправил Вам " \ "запрос на слитие веток {1} и {2} " \ "в проекте {3}\n".format(author_name, target_branch, source_branch, project_name).replace("_", "\_") try: bot.send_message(chat_id=decoder( receiver['id']), text=message + diff, parse_mode="markdown") except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) if action == 'reopen' and j < 1: message = "В проекте \"{0}\" пользователем {1} " \ "был переоткрыт merge request {2)".format(project_name, author_name, mg_title) try: bot.send_message(chat_id=decoder( receiver['id']), text=message) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) if action == 'update' and j < 1: message = "В Merge Request {0} произошло новое событие.".format( mg_title) bot.send_message(chat_id=decoder( receiver['id']), text=message) if action == 'close' and j < 1: message = "Merge request {0} был закрыт.".format( mg_title) try: bot.send_message(chat_id=decoder( receiver['id']), text=message) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) if action == 'none' and j < 1: message = "В Merge Request {0} произошло новое событие.".format( mg_title) try: bot.send_message(chat_id=decoder( receiver['id']), text=message) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) if ( action == 'update' or action == 'close' ) and j >= 1 and len(result['diffs']) - 1 != 0: message = "А так же еще изменения в {0} файлах".format( len(result['diffs']) - 1) try: bot.send_message(chat_id=decoder( receiver['id']), text=message) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) break # прерываем вывод сообщений, чтобы не засорять чат else: message = "В репозитории {0} произошло неопознанное событие".format( project_name) try: bot.send_message(chat_id=decoder( receiver['id']), text=message) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" ) # отсылаем кнопочку со ссылкой на merge request inline_item1 = types.InlineKeyboardButton( 'Merge Request', url=merge_request_url) inline_bt1 = types.InlineKeyboardMarkup() inline_bt1.add(inline_item1) try: bot.send_message( chat_id=decoder(receiver['id']), text= "Более подробную информацию о мерж реквесте можно узнать, " "перейдя по ссылке.", reply_markup=inline_bt1) except telebot.apihelper.ApiException: print( "The chat was not founded. It looks like a trouble with db :c" )
def send_welcome(message): if (message.chat.username is None) and (db.token.count_documents( {"id": encoder(str(message.chat.id))}) == 0): inline_item2 = types.InlineKeyboardButton( 'Создание Username', url='https://telegram-rus.ru/nik') inline_bt2 = types.InlineKeyboardMarkup() inline_bt2.add(inline_item2) bot.send_message( message.chat.id, "У тебя нет никнейма в телеграме, " "мне приятнее обращаться к людям по никам, а не id. " "Нажав на кнопку, ты узнаешь, как создать никнейм. " "Но если тебя все устраивает, я не настаиваю, моей работе это не помешает 🤔", parse_mode="html", reply_markup=inline_bt2) if message.chat.username is None: name_user = str(message.chat.id) else: name_user = "******" + message.chat.username st = open('./static/privet.webp', 'rb') bot.send_sticker(message.chat.id, st) if 5 <= timer[3] < 11: bot.send_message( message.chat.id, "Доброе утро , " + name_user + "! Какая же ты ранняя пташка, а я ведь мог и спать в это время 😅", parse_mode="html") if 11 <= timer[3] < 17: bot.send_message( message.chat.id, "Добрый день, " + name_user + "! Как же ты вовремя я только вернулся с обеденного перекуса 🥘 А ты покушал?", parse_mode="html") if 17 <= timer[3] < 23: bot.send_message(message.chat.id, "Добрый вечер, " + name_user + "! Ого уже вечер, ты домой то не собираешься? 🌅", parse_mode="html") if (timer[3] == 23) or (0 <= timer[3] < 5): bot.send_message( message.chat.id, "Доброй ночи... добрая ночь... в общем, привет, " + name_user + "! Ты чего не спишь, давай не засиживайся, спать - полезно 😴", parse_mode="html") if db.token.count_documents({"id": encoder(str(message.chat.id))}) == 1: cursor = db.token.find_one({"id": encoder(str(message.chat.id))}) cur = [] cursor1 = dict(cursor) for j in cursor1['token']: cur.append(decoder(j)) token_string = '\n'.join(cur) if cur: bot.send_message( message.chat.id, "По твоему id в базе данных я нашел следующие TOKEN:\n" + token_string, parse_mode="html") item1 = types.KeyboardButton("Ввод TOKEN") item2 = types.KeyboardButton("Выбор TOKEN") item3 = types.KeyboardButton("Удаление TOKEN") markup = types.ReplyKeyboardMarkup(resize_keyboard=True) markup.add(item1) markup.add(item2) markup.add(item3) bot.send_message( message.chat.id, "Хочешь добавить TOKEN, выбрать или удалить один из уже имеющихся - " "жми на соответствующие кнопочки ", parse_mode="html", reply_markup=markup) bot.register_next_step_handler(message, process_step_1) elif not cur: item1 = types.KeyboardButton("Ввод TOKEN") markup = types.ReplyKeyboardMarkup(resize_keyboard=True) markup.add(item1) bot.send_message( message.chat.id, name_user + ", по твоему id не было найденно ни одного TOKEN. " "Давай добавим, жми на кнопочку", parse_mode="html", reply_markup=markup) bot.register_next_step_handler(message, process_step_1) elif db.token.count_documents({"id": encoder(str(message.chat.id))}) > 1: bot.send_message( message.chat.id, "По твоему id в базе данных я нашел больше одного упоминания! " "Это ненормально, но твоей вины здесь нет. " "Напиши /problem и опиши этот случай " "(можешь перекопировать текст моего сообщения). Извини за неудобства 😬", parse_mode="html") elif db.token.count_documents({"id": encoder(str(message.chat.id))}) == 0: db.token.insert_one({ "id": encoder(str(message.chat.id)), "token": [], "idGitLab": [] }) inline_item1 = types.InlineKeyboardButton( 'Как получить TOKEN', url='https://habr.com/ru/company/flant/blog/340996/') inline_bt1 = types.InlineKeyboardMarkup() inline_bt1.add(inline_item1) item1 = types.KeyboardButton("Ввод TOKEN") markup = types.ReplyKeyboardMarkup(resize_keyboard=True) markup.add(item1) bot.send_message( message.chat.id, name_user + ", ты у нас впервые, твой id был удачно записан в базу данных.", parse_mode="html", reply_markup=markup) bot.send_message( message.chat.id, "Теперь давай добавим TOKEN. Если ты не знаешь, где его найти, нажми на кнопочку ", parse_mode="html", reply_markup=inline_bt1) bot.register_next_step_handler(message, process_step_1)