From bdb9f45730167f28d5689889ca2a5889814269fc Mon Sep 17 00:00:00 2001 From: Casey Link Date: Wed, 9 Feb 2011 22:38:26 -0500 Subject: [PATCH] add VTLUUG wargame module --- modules/wargame.py | 115 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 modules/wargame.py diff --git a/modules/wargame.py b/modules/wargame.py new file mode 100644 index 0000000..5577d54 --- /dev/null +++ b/modules/wargame.py @@ -0,0 +1,115 @@ +#!/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 import quote as urlquote +from urllib2 import urlopen, 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(map(lambda p: str(p), 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, 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(map(lambda s: s.name, servers))) ) +def wargame_scores(phenny, s_name): + try: + req = urlopen(APIURL) + except HTTPError, 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'] \ No newline at end of file