pycoindroid/src/Droid.py
0xDEAD10CC ced4ee4250 update
2017-07-29 16:48:05 -07:00

154 lines
7 KiB
Python

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)