96 lines
3.8 KiB
Python
Executable File
96 lines
3.8 KiB
Python
Executable File
#! /usr/bin/python3
|
|
|
|
import redis
|
|
import time
|
|
import requests
|
|
import traceback
|
|
import datetime
|
|
from lxml import html
|
|
from lxml import etree
|
|
import webhook
|
|
import conf
|
|
|
|
now = time.time()
|
|
|
|
wh = webhook.Webhook(conf.url_discord_webhook_guild)
|
|
|
|
r = redis.StrictRedis(host='localhost', charset="utf-8", decode_responses=True, db=1)
|
|
|
|
warcraft_api = "https://worldofwarcraft.com/es-es/game/pve/leaderboards/dun-modr/{}"
|
|
|
|
members = r.smembers("bot:members")
|
|
r.zremrangebyscore("bot:m+", "-inf", now-(60*60*24*7*2)) # 2 semanas
|
|
|
|
for zone, instance in conf.zones.items():
|
|
try:
|
|
page = requests.get(warcraft_api.format(zone))
|
|
hp = etree.HTMLParser(encoding=page.encoding)
|
|
tree = html.fromstring(page.content, parser=hp) # .decode(page.encoding)
|
|
|
|
top = tree.xpath('//div[@class="Media-text"]/div[@class="font-semp-medium-white"]/text()')
|
|
if len(top) < 3:
|
|
print("no affix?")
|
|
continue
|
|
|
|
affix = "" if top[0] not in conf.affixes else conf.affixes[top[0]]
|
|
affix += "" if top[1] not in conf.affixes else conf.affixes[top[1]]
|
|
affix += "" if top[2] not in conf.affixes else conf.affixes[top[2]]
|
|
|
|
rows = tree.xpath('//div[@class="SortTable-body"]/div[@class="SortTable-row"]')
|
|
#print("rows", len(rows))
|
|
|
|
for row in rows:
|
|
#print("tiempo", row.xpath('./div[5]/text()'))
|
|
#print("row", html.tostring(row))
|
|
pos = row.xpath('./div[1]/text()')[0]
|
|
lvl = int(row.xpath('./div[2]/text()')[0])
|
|
record = row.xpath('./div[3]/text()')[0]
|
|
datee = row.xpath('./div[5]/text()')[0] #row.xpath('./div[5]/@data-value')[0]
|
|
team = row.xpath('./div[4]/div/div[@class="List-item gutter-tiny"]')
|
|
#print("row", pos, lvl, time, datee, len(team))
|
|
|
|
k = "{0}.{1}.{2}.{3}".format(zone, lvl, record, datee)
|
|
inguild = False
|
|
party = []
|
|
|
|
if lvl < conf.min_mythic or r.zadd("bot:m+", now, k) == 0:
|
|
continue
|
|
|
|
for player in team:
|
|
#print("player", html.tostring(player))
|
|
name = player.xpath('.//div[@class="Character-name"]/text()')[0]
|
|
url = str(player.xpath('./a/@href')[0])
|
|
clss = str(player.xpath('./a/@class')[0])
|
|
spec = ""
|
|
for key in conf.class_icons.keys():
|
|
if key in clss:
|
|
spec = conf.class_icons[key]
|
|
#party.append("{2}{0}{1}".format(name, "" if "dun-modr" in url else " *({})*".format(url.split("/")[6]), roles[len(party)]))
|
|
party.append("{1} {0}".format(name if "dun-modr" in url else "*{}*".format(name), spec))
|
|
|
|
for member in members:
|
|
if "/{}".format(member).lower() in url and "dun-modr" in url:
|
|
inguild = True
|
|
|
|
if inguild:
|
|
chests = 0
|
|
for timer in conf.timers[zone]:
|
|
delta = datetime.datetime.strptime(record, '%H:%M:%S') - datetime.datetime.strptime(timer, '%M:%S')
|
|
if delta.total_seconds() > 0:
|
|
break
|
|
chests += 1
|
|
if chests == 3:
|
|
delta = datetime.datetime.strptime(timer, '%M:%S') - datetime.datetime.strptime(record, '%H:%M:%S')
|
|
|
|
#tip = "(piedra +{0} por {1})".format(chests, delta)
|
|
tip = "(piedra +{0})".format(chests, delta)
|
|
msg = ":mega: **[{0}](<{5}>) +{1}** hecha en **{2}** {3}, **rank {4}** de Dun Modr".format(instance, lvl, record, tip, pos, warcraft_api.format(zone))
|
|
#print(msg)
|
|
wh.clear_embeds()
|
|
wh.add_embed(webhook.embed(title=", ".join(party)))
|
|
wh.send(msg)
|
|
|
|
except:
|
|
traceback.print_exc()
|
|
time.sleep(1)
|