Created
November 2, 2017 01:28
-
-
Save MEXAHOTABOP/312139ff896944678eedc0bdaddddf46 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| # -*- coding: UTF-8 -*- | |
| import discord | |
| import requests | |
| import asyncio | |
| token = "" | |
| client = discord.Client() | |
| state_json = {} | |
| messages = {} | |
| # названия из https://github.com/WFCD/warframe-worldstate-parser/blob/master/lib/Reward.js | |
| # вопрос на миллион а используется ли potato? | |
| tracked_items = "exilus kavatGene kubrowEgg forma potato nitain reactor catalyst" | |
| channel_text = "" | |
| # Божественность 364843842937028620 | |
| # Станина борьбы 335790942311153665 | |
| # general 335790942311153664 | |
| channel_text_id = "335790942311153664" | |
| # обновление данных от https://github.com/WFCD/warframe-worldstate-parser | |
| def state_update(): | |
| global state_json | |
| state_json = requests.get('https://ws.warframestat.us/pc').json() | |
| # время в цетусе/эейдалонах | |
| def get_day_time(): | |
| global state_json | |
| time = state_json["cetusCycle"]["timeLeft"][:-3].replace("h", " час").replace("m", " мин") # локализация | |
| if time == "": # небольшой костыль когда остается меньше минуты | |
| time = "<1 мин" | |
| day = "день" if state_json["cetusCycle"]["isDay"] else "ночь" # true if test else false | |
| return "{} {}".format(day, time) | |
| # проверка текущих алертов/вторжений на предмет годных вещей | |
| def check_tracked_items(): | |
| global state_json | |
| acceptable_mission_list = {} | |
| for missions_type in ["alerts", "invasions"]: | |
| for mission in state_json[missions_type]: | |
| if mission["eta"][:1] == "-": # понятия не имею почему в списке содержатся завершенные миссии с отр eta | |
| continue | |
| acceptable_rewards = [] | |
| for reward in mission["rewardTypes"]: | |
| if reward in tracked_items: | |
| acceptable_rewards.append(reward) # во вторжениях может быть несколько годных наград | |
| if len(acceptable_rewards): | |
| id_ = mission["id"] # счел что и так слишком длинно | |
| acceptable_mission_list[id_] = {} | |
| acceptable_mission_list[id_]["type"] = missions_type | |
| acceptable_mission_list[id_]["reward"] = acceptable_rewards | |
| if missions_type == "alerts": | |
| acceptable_mission_list[id_]["node"] = mission["mission"]["node"] # название сектора (планеты) | |
| acceptable_mission_list[id_]["mission_type"] = mission["mission"]["type"] | |
| acceptable_mission_list[id_]["eta"] = mission["eta"] | |
| else: | |
| acceptable_mission_list[id_]["node"] = mission["node"] | |
| return acceptable_mission_list | |
| # локализация сообщений | |
| def l10n(text_in): | |
| localization = { | |
| "exilus": "Адаптер эксилус(чертеж?)", | |
| "kavatGene": "Генокод кавата", | |
| "kubrowEgg": "Яйцо кубрау", | |
| "forma": "Форма(чертеж?)", | |
| "potato": "Картошка(чертеж?)", | |
| "nitain": "Нитаин", | |
| "reactor": "Реактор(чертеж?)", | |
| "catalyst": "Катализатор(чертеж?)", | |
| "alerts": "Алерт", | |
| "invasions": "Вторжение", | |
| "Excavation": "Раскопки", | |
| "Defense": "Оборона", | |
| "Interception": "Перехват", | |
| "Capture": "Захват", | |
| "Survival": "Выживание", | |
| "Extermination": "Зачистка", | |
| "Sabotage": "Саботаж", | |
| } | |
| translated = localization.setdefault(text_in) | |
| if translated is None: | |
| print("не перевело: {}".format(text_in)) | |
| return text_in | |
| return translated | |
| # обновление сообщений о алертах/вторжениях с годнотой | |
| async def update_messages(): | |
| global messages | |
| global client | |
| global channel_text | |
| mission_dict = check_tracked_items() | |
| new_set = set(mission_dict.keys()) | |
| old_set = set(messages.keys()) | |
| for to_remove in old_set.difference(new_set): | |
| await client.delete_message(messages.pop(to_remove)) | |
| for to_add in new_set.difference(old_set): | |
| mission = mission_dict[to_add] | |
| rewards = "" | |
| for reward in mission["reward"]: | |
| rewards = "{} {}".format(l10n(reward), rewards) | |
| rewards = rewards.replace(" ", " или ")[:-5] # что то я уже совсем в костыли ушел | |
| # алертоспецифичные строчки | |
| eta = "" | |
| mission_type = "" | |
| if mission["type"] == "alerts": | |
| eta = mission["eta"][:-3].replace("h", " час").replace("m", " мин") | |
| eta = "\nзаканчивается через: {}".format(eta) | |
| mission_type = l10n(mission["mission_type"]) | |
| mission_type = "миссия: {},".format(mission_type) | |
| msg = "{}: {}, {} награда: {} {}"\ | |
| .format(l10n(mission["type"]), mission["node"], mission_type, rewards, eta) | |
| messages[to_add] = await client.send_message(channel_text, msg) | |
| async def main_loop(): | |
| global client | |
| global channel_text | |
| while True: | |
| if channel_text != "": | |
| break | |
| await asyncio.sleep(1) | |
| while True: | |
| state_update() | |
| await update_messages() | |
| await client.change_presence(game=discord.Game(name=get_day_time())) # играет в ... | |
| await asyncio.sleep(30) | |
| # вспомогательная функция для фильтра сообщений | |
| def is_my_message(m): | |
| return m.author == client.user | |
| @client.event | |
| async def on_ready(): | |
| global client | |
| global channel_text | |
| global channel_text_id | |
| print("ник {}".format(client.user.name)) | |
| # выбор текстового канала | |
| channel_text = client.get_channel(channel_text_id) | |
| print("текстовый канал {}".format(channel_text.name)) | |
| # удаление сообщений из прошлого запуска | |
| deleted = await client.purge_from(channel_text, check=is_my_message) | |
| print("удалено прошлых сообщений {}".format(len(deleted))) | |
| client.loop.create_task(main_loop()) | |
| client.run(token) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment