### # Copyright (c) 2021, Pedro de Oliveira # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions, and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions, and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author of this software nor the name of # contributors to this software may be used to endorse or promote products # derived from this software without specific prior written consent. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. ### from supybot import utils, plugins, ircutils, callbacks from supybot.commands import * try: from supybot.i18n import PluginInternationalization _ = PluginInternationalization('Morte') except ImportError: # Placeholder that allows to run the plugin on a bot # without the i18n module _ = lambda x: x from datetime import timedelta, datetime import json import re import random import requests from requests.exceptions import Timeout from bs4 import BeautifulSoup class Morte(callbacks.Plugin): """SICO Client""" threaded = True timeout=5 # In minutes fields = [ '< 1 ano', '1-4 anos', '5-17 anos', '18-33 anos', '34-69 anos', '≥ 70 anos', 'Desconhecido', ] regex = r"\"Atualizado a (\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)\"" last = {} def status(self, irc, msg, args): """ Returns the today death count from SICO. """ refresh=True record={} diff={ '< 1 ano': 0, '1-4 anos': 0, '5-17 anos': 0, '18-33 anos': 0, '34-69 anos': 0, '≥ 70 anos': 0, 'Desconhecido': 0, } if len(self.last) > 0: dt_old = self.last['dt'] + timedelta(minutes=self.timeout) if dt_old > datetime.now(): refresh=False if refresh: try: response = requests.get("https://evm.min-saude.pt/table?t=prematura&s=0", timeout=2) except Timeout: irc.error("9,14[SICO]9 {}".format("TIMEOUT"), prefixNick=True) return response.encoding="utf-8" soup = BeautifulSoup(response.text, 'html.parser',) javascript = soup.find('div', class_="active").find('script').string values = json.loads(javascript) try: response = requests.get("https://evm.min-saude.pt/chart?t=main&s=0", timeout=2) except Timeout: irc.error("9,14[SICO]9 {}".format("TIMEOUT"), prefixNick=True) return response.encoding="utf-8" match = re.search(self.regex, response.text) if not match: irc.error("9,14[SICO]9 {}".format("Parse error - no date"), prefixNick=True) return # last update date up_dt = datetime( year=int(match.group(3)), month=int(match.group(2)), day=int(match.group(1)), hour=int(match.group(4)), minute=int(match.group(5)), second=int(match.group(6)), ) dt = datetime.now() for index, value in enumerate(values['x']['data'], start=-1): if index < 0: continue key = self.fields[index] value = int(value[-1]) record[key] = value if len(self.last) > 0 and dt.strftime("%d") == self.last['dt'].strftime("%d"): diff[key] = value - self.last['record'][key] else: dt = self.last['dt'] record = self.last['record'] up_dt = self.last['up_dt'] pipe=False total=0 message = "9,14[SICO]9 {} ".format(up_dt.strftime("%Y-%m-%d")) for key in record: if record[key] == 0: continue total += record[key] if pipe: message += " | " message += "{}: {}{}".format( key, record[key], " (+{})".format(diff[key]) if diff[key] > 0 else "" ) if key in ['< 1 ano', '1-4 anos'] and random.random() < 0.15: message += " 13【BABALITY!】" pipe=True if total > 0: message += " | Total: {}".format( total ) else: message += " ZERO!!!" irc.reply(message, prefixNick=False) if refresh: self.last = { 'dt': dt, 'up_dt': up_dt, 'record': record } status = wrap(status, []) Class = Morte # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: