1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #! /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)
|