Skip to content

Instantly share code, notes, and snippets.

@MEXAHOTABOP
Created November 2, 2017 01:28
Show Gist options
  • Save MEXAHOTABOP/312139ff896944678eedc0bdaddddf46 to your computer and use it in GitHub Desktop.
Save MEXAHOTABOP/312139ff896944678eedc0bdaddddf46 to your computer and use it in GitHub Desktop.
#!/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