discord-vk-pythonbot/midnight.py

229 lines
15 KiB
Python
Raw Permalink Normal View History

2024-05-13 13:02:44 +00:00
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")