import datetime import config import aprint import json import requests import random from urllib.request import urlopen aprint.info("Script started") try: fwords = json.loads(open("fword.json", "r").read()) except: fwords = {"vk_fwords": {}, "ds_fwords": {}, "vk_last_fword": 0, "ds_last_fword": 0, "created": datetime.datetime.utcnow().timestamp()} ds_delete_fword = requests.delete(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members/{fwords['ds_last_fword']}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) if ds_delete_fword.ok: aprint.info(f"Discord remove role: {ds_delete_fword.status_code} {ds_delete_fword.reason}") else: aprint.error(f"Discord remove role: {ds_delete_fword.status_code} {ds_delete_fword.reason}") midnight_text = ["Миднайт!", "Полночь!", "Midnight!", "миднигхт", "Середина ночи", "Смена даты!", "00:00", "Пора ложиться спать!", "12 ночи", "Медьникель!", "Мёднугхт!", "Ночное рандеву", "Опівночі!", "Арабская ночь", "Конец смены"] role_names = ["F-word дня", "Лох дня", "Приговорить к расстрелу", "Малолетний дебил", "Он отправится в Бразилию", "Пропустил много стрелок пока битбоксил с пикой точеной", "В дурку отправляется", "Поставил крейзифрог на рингтон", "Попросил наступить на себя еще раз", "ААХАААА ОН ДОЛБОЁБ ПОСМОТРИТЕ НА НЕГООО!!", "парннь ты долбоёб", "Быдло дня", "Фоткаю лучшего подписчика. Улыбнись", "Восхваляет солнце"] imgvkrequest = requests.post("https://api.vk.com/method/photos.get", data={'owner_id': "-" + str(config.VK_GROUP_ID), 'album_id': config.VK_ALBUM_MIDNIGHT_ID, 'count': 1000, 'access_token': config.VK_SERVICE_TOKEN, 'v': '5.124'}) if imgvkrequest.ok: try: random_images_query = json.loads(imgvkrequest.text) random_number = random.randint(0, random_images_query['response']['count']-1) aprint.info(f"VK method 'photos.get': {imgvkrequest.status_code} {imgvkrequest.reason}, returned photos: {random_images_query['response']['count']}, selected: {random_number}") image = random_images_query['response']['items'][random_number] image_request = urlopen(image["sizes"][-1]['url']).read() image_file = open("md.jpg", "wb") image_file.write(image_request) image_file.close() MIDNIGHT_IMAGE = True except Exception as e: MIDNIGHT_IMAGE = False aprint.error(f"Error while getting image: {str(e)}") else: MIDNIGHT_IMAGE = False aprint.error(f"VK method 'photos.get': {imgvkrequest.status_code} {imgvkrequest.reason}") selected = random.choice(midnight_text) now = datetime.datetime.utcnow() new_date = now + datetime.timedelta(hours=3, minutes=3) to_ny = datetime.datetime(year=2022, month=1, day=1) - now if 30 >= to_ny.days > 1: if MIDNIGHT_IMAGE: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось {to_ny.days} дн.\nКартинка дня:" else: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось {to_ny.days} дн.\nОшибка при получении картинки дня" elif to_ny.days == 1: if MIDNIGHT_IMAGE: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось 24 часа.\nКартинка дня:" else: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nДо нового года осталось 24 часа.\nОшибка при получении картинки дня" elif to_ny.days == 0: if MIDNIGHT_IMAGE: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nC новым, 2022 годом!!!\nКартинка дня:" else: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nC новым, 2022 годом!!!\nОшибка при получении картинки дня" else: if MIDNIGHT_IMAGE: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\nКартинка дня:" else: text = f"{selected}\nНаступило {new_date.strftime('%d.%m.%Y')}\n\nОшибка при получении картинки дня" aprint.info(f"All ready. Waiting...") MIDNIGHT = False while not MIDNIGHT: now = datetime.datetime.utcnow() if now.hour == 21 and now.minute == 0 and now.second == 1: aprint.info("Midnight") if MIDNIGHT_IMAGE: dcrequest = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}', 'Content-Disposition': 'form-data; filename="md.jpg"'}, data={'payload_json': json.dumps({'content': text}), }, files={'file': open("md.jpg", 'rb')}) vkrequest = requests.post("https://api.vk.com/method/messages.send", data={'peer_id': int(config.VK_DIALOG_ID), 'message': text, 'random_id': random.randint(-9223372036854775808, 9223372036854775807), 'attachment': f"photo{image['owner_id']}_{image['id']}", 'access_token': config.VK_TOKEN, 'v': '5.124'}) else: dcrequest = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, data={'payload_json': json.dumps({'content': text}), }) vkrequest = requests.post("https://api.vk.com/method/messages.send", data={'peer_id': int(config.VK_DIALOG_ID), 'message': text, 'random_id': random.randint(-9223372036854775808, 9223372036854775807), 'access_token': config.VK_TOKEN, 'v': '5.124'}) if dcrequest.ok: aprint.info(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") else: aprint.error(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") if vkrequest.ok: aprint.info(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") else: aprint.error(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") vk_users_request = requests.post("https://api.vk.com/method/messages.getConversationMembers", data={'peer_id': config.VK_DIALOG_ID, 'fields': config.VK_ALBUM_MIDNIGHT_ID, 'group_id': config.VK_GROUP_ID, 'access_token': config.VK_TOKEN, 'v': '5.124'}) if vk_users_request.ok: aprint.info(f"VK method 'messages.getConversationMembers': {vk_users_request.status_code} {vk_users_request.reason}") random_members_query = json.loads(vk_users_request.text) if not fwords.get('vk_fword_story_3'): fwords['vk_fword_story_3'] = 0 if not fwords.get('vk_fword_story_2'): fwords['vk_fword_story_2'] = 0 if not fwords.get('vk_fword_story_1'): fwords['vk_fword_story_1'] = 0 new_vk_fword = False while not new_vk_fword: random_member = random.choice(random_members_query['response']['profiles']) black_list = [292394871, 32272927] white_list = [260168666] debug_text = f"VK random person: {random_member['first_name']} {random_member['last_name']} - " if (random_member['id'] != fwords['vk_last_fword'] and random_member['id'] != fwords['vk_fword_story_1'] and random_member['id'] != fwords['vk_fword_story_2'] and random_member['id'] != fwords['vk_fword_story_3'] and random_member['id'] not in white_list) or random_member['id'] in black_list: aprint.debug(debug_text + "selected") fwords['vk_fword_story_3'] = fwords['vk_fword_story_2'] fwords['vk_fword_story_2'] = fwords['vk_fword_story_1'] fwords['vk_fword_story_1'] = fwords['vk_last_fword'] fwords['vk_last_fword'] = random_member['id'] if str(random_member['id']) in fwords["vk_fwords"]: fwords["vk_fwords"][str(random_member['id'])] += 1 else: fwords["vk_fwords"][str(random_member['id'])] = 1 text = f"{random.choice(role_names)}: @id{random_member['id']} ({random_member['first_name']} {random_member['last_name']})" vkrequest = requests.post("https://api.vk.com/method/messages.send", data={'peer_id': config.VK_DIALOG_ID, 'message': text, 'random_id': random.randint(-9223372036854775808, 9223372036854775807), 'access_token': config.VK_TOKEN, 'v': '5.124'}) new_vk_fword = True if vkrequest.ok: aprint.info(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") else: aprint.error(f"Message to VK: {vkrequest.status_code} {vkrequest.reason}") else: aprint.debug(debug_text + "not selected") else: aprint.error(f"VK method 'messages.getConversationMembers': {vk_users_request.status_code} {vk_users_request.reason}") ds_members_r = requests.get(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members?limit=1000", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) if ds_members_r.ok: aprint.info(f"Discord guild member list request: {ds_members_r.status_code} {ds_members_r.reason}") ds_members = json.loads(ds_members_r.text) if not fwords.get('ds_fword_story_3'): fwords['ds_fword_story_3'] = 0 if not fwords.get('ds_fword_story_2'): fwords['ds_fword_story_2'] = 0 if not fwords.get('ds_fword_story_1'): fwords['ds_fword_story_1'] = 0 new_ds_fword = False black_list = [235010902640820225, 611931400094089269] white_list = [324555734115418112] while not new_ds_fword: member_fword = random.choice(ds_members) debug_text = f"DS random person: {member_fword['user']['username']}#{member_fword['user']['discriminator']} - " if (member_fword['user']['id'] != fwords['ds_last_fword'] and member_fword['user']['id'] != fwords['ds_fword_story_1'] and member_fword['user']['id'] != fwords['ds_fword_story_2'] and member_fword['user']['id'] != fwords['ds_fword_story_3'] and member_fword['user']['id'] not in white_list) or member_fword['user']['id'] in black_list: aprint.debug(debug_text + "selected") fwords['ds_fword_story_3'] = fwords['ds_fword_story_2'] fwords['ds_fword_story_2'] = fwords['ds_fword_story_1'] fwords['ds_fword_story_1'] = fwords["ds_last_fword"] fwords["ds_last_fword"] = member_fword['user']['id'] new_ds_fword = True random_role = random.choice(role_names) ds_req_rename_role = requests.patch(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, json={'name': random_role, 'color':random.randint(0x000000, 0xffffff)}) if ds_req_rename_role.ok: aprint.info(f"Discord rename role: {ds_req_rename_role.status_code} {ds_req_rename_role.reason}") else: aprint.error(f"Discord rename role: {ds_req_rename_role.status_code} {ds_req_rename_role.reason}") text = f"{random_role}: <@{member_fword['user']['id']}>" ds_send_message_r = requests.post(f"https://discordapp.com/api/channels/{config.DISCORD_CHANNEL_ID}/messages", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}, data={'payload_json': json.dumps({'content': text})}) if ds_send_message_r.ok: aprint.info(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") else: aprint.error(f"Message to Discord: {dcrequest.status_code} {dcrequest.reason}") ds_set_fword = requests.put(f"https://discordapp.com/api/guilds/{config.DISCORD_GUILD}/members/{member_fword['user']['id']}/roles/{config.DISCORD_ROLE_fword}", headers={'Authorization': f'Bot {config.DISCORD_TOKEN}'}) if ds_set_fword.ok: aprint.info(f"Discord set role: {ds_set_fword.status_code} {ds_set_fword.reason}") else: aprint.error(f"Discord set role: {ds_set_fword.status_code} {ds_set_fword.reason}") if str(member_fword['user']['id']) in fwords['ds_fwords']: fwords['ds_fwords'][str(member_fword['user']['id'])] += 1 else: fwords['ds_fwords'][str(member_fword['user']['id'])] = 1 else: aprint.debug(debug_text + "not selected") else: aprint.error(f"Discord guild member list request: {ds_members_r.status_code} {ds_members_r.reason}") with open("fword.json", "w") as jsn: json.dump(fwords, jsn) MIDNIGHT = True aprint.info("Done")