import json import discord from discord.ext import commands, tasks import requests from bs4 import BeautifulSoup import datetime # Read token from file f = open("token.txt", "r") token = f.readline() f.close() # Read channel/name pairs from file f = open("subs.json", "r") data = f.read() f.close() subs = json.loads(data) la_servers = {} intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) def get_servers_status(): print("Getting servers", end = " ") print(str(datetime.datetime.now())) r = requests.get("https://www.playlostark.com/en-us/support/server-status") soup = BeautifulSoup(r.content, features = "html.parser") servers = soup.find_all("div", class_="ags-ServerStatus-content-responses-response-server") server_objs = [] for server in servers: obj = {} obj["Server"] = server.text.strip() if len(server.find_all("div", class_="ags-ServerStatus-content-responses-response-server-status--good")) != 0: obj["Status"] = "Good" elif len(server.find_all("div", class_="ags-ServerStatus-content-responses-response-server-status--busy")) != 0: obj["Status"] = "Busy" elif len(server.find_all("div", class_="ags-ServerStatus-content-responses-response-server-status--full")) != 0: obj["Status"] = "Full" elif len(server.find_all("div", class_="ags-ServerStatus-content-responses-response-server-status--maintenance")) != 0: obj["Status"] = "Maintenance" else: obj["Status"] = "Unknown" server_objs.append(obj) return server_objs def save_subs(): global subs f = open("subs.json", "w") txt = json.dumps(subs) f.write(txt) f.close() @client.event async def on_ready(): check_status.start() print("We have logged in as {0.user}".format(client)) globals()["la_servers"] = get_servers_status() @client.event async def on_message(message): globalList = globals() global subs # Ignore messages from us if message.author == client.user: return # Ignore if we're not mentioned if client.user not in message.mentions: return # Remove all mentions contents = message.content.split() msg = "" for fragment in contents: if fragment.startswith("<") == False: msg = fragment # Subscribe if msg.startswith("+"): status = "" for server in globalList["la_servers"]: if server["Server"] == msg[1:]: status = server["Status"] if status == "": await message.channel.send("Unknown server - " + msg[1:]) return for sub in subs: if sub["Channel"] == message.channel.id: if sub["Server"] == msg[1:]: await message.channel.send("Already subbed to " + msg[1:] + "\nStatus - " + status) return sub = {} sub["Channel"] = message.channel.id sub["Server"] = msg[1:] globalList["subs"].append(sub) save_subs() await message.channel.send("Subscribed to " + msg[1:] + "\nStatus - " + status) return # Unsubscribe if msg.startswith("-"): for idx in range(len(subs)): if subs[idx]["Channel"] == message.channel.id: if subs[idx]["Server"] == msg[1:]: globalList["subs"].pop(idx) save_subs() await message.channel.send("Unsubscribed from " + msg[1:]) return await message.channel.send("Already unsubscribed from " + msg[1:]) return @tasks.loop(seconds = 60) async def check_status(): globalList = globals() curr_status = get_servers_status() for curr in curr_status: for saved in globalList["la_servers"]: if curr["Server"] == saved["Server"] and curr["Status"] != saved["Status"]: for sub in globalList["subs"]: if sub["Server"] == curr["Server"]: channel = client.get_channel(sub["Channel"]) print("Channel", end = " ") print(sub["Channel"]) print("Server", end = " ") print(sub["Server"]) if channel is not None: await channel.send(curr["Server"] + " changed status to " + curr["Status"]) globalList["la_servers"] = curr_status client.run(token)