#!/usr/bin/python2 # -*- coding: utf-8 -*- """ wargame.py - wargame module for the vtluug wargame http://wargame.vtluug.org author: Casey Link """ import random import configparser, os from urllib.parse import quote as urlquote from urllib.request import urlopen from urllib.error import HTTPError from lxml import etree from lxml import objectify from datetime import datetime import re APIURL = "http://wargame.vtluug.org/scoreboard.xml" class server(object): def __init__(self, name): self.name = name self.players = [] def __str__(self): s = "%s - %d players: " %(self.name, len(self.players)) s += ", ".join([str(p) for p in self.players]) return s class player(object): def __init__(self, name): self.name = name self.score = "-1" self.isOwner = False def __str__(self): return "%s%s: %s points" %(self.name, " (Current King)" if self.isOwner else "", self.score) def __cmp__(self, other): if int(self.score) < int(other.score): return -1 elif int(self.score) == int(other.score): return 0 else: return 1 def parse_player(player_element): p = player( player_element.attrib.get("name") ) p.score = player_element.attrib.get("score") p.isOwner = player_element.attrib.get("isOwner") == "True" return p def parse_server(server_element): s = server( server_element.name.text ) for player_e in server_element.players.player: s.players.append( parse_player( player_e ) ) s.players.sort() s.players.reverse() return s def wargame(phenny, input): if input.group(2) is not None: rest = input.group(2) m = re.match("^scores\s+(\S+)\s*$",rest) if m is not None and len( m.groups() ) == 1: return wargame_scores(phenny, m.group(1)) m = re.match("^scores\s*$",rest) if m is not None: return wargame_scores(phenny, "Total") m = re.match("^help\s*$",rest) if m is not None: phenny.say("VTLUUG King of the Root - http://wargame.vtluug.org'") phenny.say("syntax: '.wargame' to see network status and target list'") phenny.say("syntax: '.wargame scores ' to get current scores for a target'") return else: phenny.say("hmm.. I don't know what you mean. try '.wargame help'") return try: req = urlopen(APIURL) except HTTPError as e: phenny.say("uhoh. try again later, mmkay?") return root = objectify.parse(req).getroot() online = root.attrib.get("online") == "True" updated = root.attrib.get("updated") servers = [] for server_e in root.servers.server: servers.append( parse_server( server_e ) ) phenny.say( "wargame network is %s. last updated %s. available targets: %s" % ( "ONLINE" if online else "OFFLINE", updated, ", ".join([s.name for s in servers])) ) def wargame_scores(phenny, s_name): try: req = urlopen(APIURL) except HTTPError as e: phenny.say("uhoh. try again later, mmkay?") return root = objectify.parse(req).getroot() online = root.attrib.get("online") == "True" updated = root.attrib.get("updated") servers = {} for server_e in root.servers.server: s = parse_server( server_e ) servers[s.name] = s if not s_name in servers: phenny.say("sorry, i couldn't find %s" % ( s_name )) return phenny.say( str(servers[s_name]) ) wargame.commands = ['wargame']