diff --git a/covidData.py b/covidData.py new file mode 100644 index 0000000..ec42fb3 --- /dev/null +++ b/covidData.py @@ -0,0 +1,39 @@ +#!/usr/bin/python + + +class covidData(): + def __init__(self, selection='', import_data=[]): + super().__init__() + if(selection and len(import_data) > 8): + self.set_data(selection, import_data) + else: + self.data = { + 'Selection': '', + 'Total Cases': '', + 'New Cases': '', + 'Total Deaths': '', + 'New Deaths': '', + 'Total Recovered': '', + 'Active Cases': '', + 'Serious/Critical': '', + 'Total Cases/1M Population': '' + } + + def set_data(self, selection, import_data): + self.data = { + 'Selection': selection, + 'Total Cases': import_data[1].strip(), + 'New Cases': import_data[2].strip(), + 'Total Deaths': import_data[3].strip(), + 'New Deaths': import_data[4].strip(), + 'Total Recovered': import_data[5].strip(), + 'Active Cases': import_data[6].strip(), + 'Serious/Critical': import_data[7].strip(), + 'Total Cases/1M Population': import_data[8].strip() + } + + def get_formatted_data(self): + output = '' + for key in self.data.keys(): + output += f'{key}: {self.data[key]}\n' + return output diff --git a/covid_bot.py b/covid_bot.py new file mode 100644 index 0000000..8230e60 --- /dev/null +++ b/covid_bot.py @@ -0,0 +1,37 @@ +#!/bin/python + +import discord +from discord.ext import commands +from parse_data import update_data, get_covid_data, covid_db +from re import match +from datetime import datetime +from asyncio import sleep + + +class MyClient(discord.Client): + async def on_ready(self): + print('Logged on as', self.user) + + async def on_message(self, message): + # don't respond to ourselves + if(message.author == self.user): + return + + if(message.content == '!ping'): + await message.channel.send('pong') + + report_match = match(r'(!report )([a-zA-Z\-\_\. ]+)', message.content) + if(report_match): + with open('.keys/report_channel_id') as cid: + channel = self.get_channel(int(cid.readline().strip())) + if(report_match.group(2).upper() == 'KEYS'): + await channel.send(covid_db.keys()) + else: + await channel.send(get_covid_data(report_match.group(2).upper())) + + +if(__name__ == '__main__'): + with open('.keys/bot_api.key') as key: + discord_api_key = key.readline().strip() + client = MyClient() + client.run(discord_api_key) diff --git a/daily_report.py b/daily_report.py new file mode 100644 index 0000000..a8c953a --- /dev/null +++ b/daily_report.py @@ -0,0 +1,31 @@ +#!/bin/python + +import discord +from discord.ext import commands +from parse_data import update_data, get_covid_data, covid_db +from re import match +from datetime import datetime +from asyncio import sleep + + +async def background_task(client): + await client.wait_until_ready() + with open('.keys/report_channel_id') as cid: + channel = client.get_channel(int(cid.readline().strip())) + while not client.is_closed(): + current_hour_and_minute = [int(t) for t in str( + datetime.now().time()).split(':')[:-1]] + if(current_hour_and_minute[0] == 12 and (current_hour_and_minute[1] == 0)): + update_data() + await channel.send('Daily report from: https://www.worldometers.info/coronavirus/') + await channel.send(get_covid_data('USA')) + await channel.send(get_covid_data('TOTAL')) + await sleep(60) + + +if(__name__ == '__main__'): + with open('.keys/bot_api.key') as key: + discord_api_key = key.readline().strip() + client = discord.Client() + client.loop.create_task(background_task(client)) + client.run(discord_api_key) diff --git a/main.py b/main.py deleted file mode 100644 index b22b035..0000000 --- a/main.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/python - -import discord -from discord.ext import commands -from parse_data import get_current_data - - -class MyClient(discord.Client): - async def on_ready(self): - print('Logged on as', self.user) - - async def on_message(self, message): - # don't respond to ourselves - if(message.author == self.user): - return - - if(message.content == 'ping'): - await message.channel.send('pong') - - if(message.content == 'report'): - with open('.keys/report_channel_id') as cid: - channel = self.get_channel(int(cid.readline().strip())) - await channel.send(get_current_data()) - - -if(__name__ == '__main__'): - with open('.keys/bot_api.key') as key: - client = MyClient() - client.run(key.readline().strip()) diff --git a/parse_data.py b/parse_data.py index b42a60f..e9ead79 100644 --- a/parse_data.py +++ b/parse_data.py @@ -2,30 +2,32 @@ import requests from bs4 import BeautifulSoup +from covidData import covidData + +# temporary database +covid_db = {} -def get_current_data(): +def update_data(): data_html = requests.get('https://www.worldometers.info/coronavirus/') if(data_html.status_code == '200' or data_html.status_code == 200): - parsed_html = BeautifulSoup(data_html.text) + parsed_html = BeautifulSoup(data_html.text, features='html.parser') table = parsed_html.find('table', id='main_table_countries_today') - all_rows = table.findAll('tr') - for row in all_rows: - if(row and row.findAll('td') and row.find('a')): - all_cols = row.findAll('td') - if(row.find('a').text == 'USA'): - return f''' - {row.find('a').text} - Total Cases: {all_cols[1].text} - New Cases: {all_cols[2].text} - Total Deaths: {all_cols[3].text} - New Deaths: {all_cols[4].text} - Total Recovered: {all_cols[5].text} - Active Cases: {all_cols[6].text} - Serious/Critical: {all_cols[7].text} - Total Cases/1M Population: {all_cols[8].text} - ''' + for row in table.findAll('tr'): + if(row and row.findAll('td')): + if(row.find('a')): + covid_db[row.find('a').text.upper()] = covidData( + row.find('a').text, [r.text for r in row.findAll('td')]) + elif(row.findAll('td')[0] and row.findAll('td')[0].text): + covid_db[row.findAll('td')[0].text.replace(':', '').upper()] = covidData( + row.findAll('td')[0].text.replace(':', ''), [r.text for r in row.findAll('td')]) + + +def get_covid_data(selection): + if(not covid_db): + update_data() + return covid_db[selection].get_formatted_data() if(__name__ == '__main__'): - print(get_current_data()) + print(get_covid_data())