import logging, telepot from CoindroidAPI import CoindroidAPITask from gevent import sleep from collections import namedtuple # from twilio.rest import Client as TwilioClient class DroidControllerTask(CoindroidAPITask): def __init__(self, **kwargs): super(DroidControllerTask, self).__init__(**kwargs) self.logger = logging.getLogger(self.__class__.__name__) self.droidTuple = namedtuple("droidTuple", ["block_height", "action_id", "action_type", "player_id", "player_username", "droid_id", "droid_name", "targetID", "targetName", "healthChangedFrom", "healthChangedTo", "netDamageTaken", "experienceEarned", "grossDamagePerformed", "experienceChangedFrom", "experienceChangedTo", ]) # twilioAccount = "ACdfcd2b529db83954e8a0041796072960" # twilioToken = "ab9b98a0b3da8a728d14774192773af2" # try: # self.twilioClient = TwilioClient(twilioAccount, twilioToken) # except: # self.logger.exception("Unable to initialize Twilio client!") try: self.telegramBot = telepot.Bot( "382491836:AAGj8Hf5HNAwcukRrjQ3Eyv7TSa2YvGax5s") except: self.logger.exception("Unable to initialize Telegram bot!") def getDroidStats(self, event): targetID = None targetName = None try: targetID = event.get("target").get("id") targetName = event.get("target").get("name") except AttributeError: self.logger.exception("Unknown target!") return {} return { "block_height": event.get("block_height"), "action_id": event.get("action_id"), "action_type": event.get("action_type"), "player_id": event.get("player_id"), "player_username": event.get("player_username"), "droid_id": event.get("droid_id"), "droid_name": event.get("droid_name"), "targetID": targetID, "targetName": targetName, "healthChangedFrom": next( (x.get("value_from") for x in event.get("outcomes") if x.get("outcome_type") == "Health changed"), None), "healthChangedTo": next( (x.get("value_to") for x in event.get("outcomes") if x.get("outcome_type") == "Health changed"), None), "netDamageTaken": next( (x.get("value_to") for x in event.get("outcomes") if x.get("outcome_type") == "Net damage taken"), None), "experienceEarned": next( (x.get("value_to") for x in event.get("outcomes") if x.get("outcome_type") == "Experience earned"), None), "grossDamagePerformed": next( (x.get("value_to") for x in event.get("outcomes") if x.get("outcome_type") == "Gross damage performed"), None), "experienceChangedFrom": next( (x.get("value_from") for x in event.get("outcomes") if x.get("outcome_type") == "Experience changed"), None), "experienceChangedTo": next( (x.get("value_to") for x in event.get("outcomes") if x.get("outcome_type") == "Experience changed"), None) } def sendSMS(self, from_="+14159037708", **kwargs): try: self.twilioClient.messages.create(from_=from_, **kwargs) except: self.logger.exception("Unable to send SMS!!") pass def genMessage(self, stats): baseMessage = "{block_height}:{action_id} - " \ "{player_username}({player_id}):{droid_name}(" \ "{droid_id}) did {action_type} on " \ "{targetName}({targetID}).".format(**stats) message = [baseMessage] if stats["healthChangedFrom"] or stats["healthChangedTo"]: message.append( "Health changed from {healthChangedFrom} to " \ "{healthChangedTo}.".format( **stats)) if stats["netDamageTaken"]: message.append("{netDamageTaken} damage was taken.".format(**stats)) if stats["experienceEarned"]: message.append( "{experienceEarned} experience was earned.".format(**stats)) if stats["grossDamagePerformed"]: message.append( "{grossDamagePerformed} gross damage was performed.".format( **stats)) if stats["experienceChangedFrom"] or stats["experienceChangedTo"]: message.append( "Experience changed from {experienceChangedFrom} to " \ "{experienceChangedTo}.".format( **stats)) message = "\n".join(message) return message def _run(self): self.logger.info("Running {}".format(self.__class__.__name__)) while True: if not self.droidControllerQueue.empty(): self.logger.debug( "{} woken up...".format(self.__class__.__name__)) events = self.droidControllerQueue.get() for event in events: stats = self.getDroidStats(event) message = self.genMessage(stats) self.logger.info(message) if (stats["droid_name"] == "bob") or ( stats["targetName"] == "bob") or ( stats["droid_id"] == 160) or ( stats["targetID"] == 160): self.logger.debug( "bob's got an action!!! sending sms!!") # if self.twilioClient: # self.sendSMS(to="+14088963912", body=message) if self.telegramBot: self.telegramBot.sendMessage(-228315434, message) if (stats["droid_name"] == "Mabuhay") or ( stats["targetName"] == "Mabuhay") or ( stats["droid_id"] == 165) or stats[ "targetID"] == 165: self.logger.debug( "Mabuhay's got an action!!! sending sms!!") # if self.twilioClient: # self.sendSMS(to="+14086342295", body=message) if self.telegramBot: self.telegramBot.sendMessage(-228315434, message) else: self.logger.debug("Queue is empty... No action to take...") sleep(self.pause)