This commit is contained in:
0xDEAD10CC 2017-07-25 18:35:28 -07:00
parent 586014ffe4
commit 68912fed15
5 changed files with 95 additions and 126 deletions

View file

@ -1,92 +1,85 @@
import logging
from CoindroidAPI import CoindroidAPITask
from gevent import sleep
from collections import namedtuple
from twilio.rest import Client as TwilioClient
# todo Flesh out getting events to Droids and having them act accordingly
class DroidTask(CoindroidAPITask):
class DroidControllerTask(CoindroidAPITask):
def __init__(self, **kwargs):
"""
This is a DroidTask
It performs actions on events received from:w
:param \**kwargs:
See below
:Keyword Arguments:
* *apiUrl* (``str``) --
Coindroids API URL.
Default is ``https://api.coindroids.com/``
* *pause* (``int``) --
Time to wait between requests
"""
super(EventTask, self).__init__(**kwargs)
self.logger = logging.getLogger(__name__)
self.updateEvents()
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"
self.twilioClient = TwilioClient(twilioAccount, twilioToken)
def updateEvents(self):
while True:
try:
request = self.apiSession.get(self.apiUrl + "event",
params={"order" : "block_height.desc",
"currency_id": "eq.2"})
# "involved_droids": ""}).json()
except:
self.logger.exception("Unable to get events!")
self.logger.error("Waiting for update...")
sleep(self.pause)
continue
self.currentTransaction = request.json()
self.logger.info("Retrieved events from Coindroids...")
self.logger.debug("{} events found...".format(len(self.currentTransaction)))
if not self.lastTransaction:
self.logger.info("No previous events available... Waiting for update...")
self.lastTransaction = self.currentTransaction.copy()
self.currentTransaction = None
sleep(self.pause)
continue
break
def getDroidStats(self, event):
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" : event.get("target").get("id"),
"targetName" : event.get("target").get("name"),
"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 compareEvents(self):
"""
Compares old events to new events
:return: list of events
"""
setLastEventsIDs = set([x.get("action_id") for x in self.lastTransaction])
setEventsIDs = set([x.get("action_id") for x in self.currentTransaction])
setRemovedEvents = setLastEventsIDs - setEventsIDs
setAddedEvents = setEventsIDs - setLastEventsIDs
ret = []
if setRemovedEvents:
self.logger.debug("Events removed from this update: {}".format(setRemovedEvents))
if setAddedEvents:
self.logger.debug("Added events:")
for event_id in setAddedEvents:
for event in self.currentTransaction:
if event:
if event["action_id"] == event_id:
ret.append(event)
self.logger.debug("At block_height {}, action_id {} - {}({}):{}({}) did {} on {}".format(
*(event.get(i) for i in ("block_height",
"action_id", "player_username", "player_id",
"droid_name", "droidID", "action_type",
"target"))))
else:
self.logger.error("Found empty event!")
return ret
def sendSMS(self, from_="+14159037708", **kwargs):
try:
self.twilioClient.messages.create(from_=from_, **kwargs)
except:
self.logger.exception("Unable to send SMS!!")
pass
def _run(self):
self.logger.info("Running {}".format(self.__class__.__name__))
while True:
if self.eventsEvent.ready():
if not self.droidControllerQueue.empty():
self.logger.debug("{} woken up...".format(self.__class__.__name__))
for _ in range(5):
self.logger.debug("Trying to get updated events ({}/5)".format(_))
update = self.compareEvents()
if update:
self.logger.debug("TODO: Send events to queue for worker threads")
break
events = self.droidControllerQueue.get()
for event in events:
stats = self.getDroidStats(event)
message = "At block_height {block_height}, action_id {action_id} - " \
"{player_username}({player_id}):{droid_name}({droid_id}) did {action_type} on " \
"{targetName}({targetID}). Health changed from {healthChangedFrom} to " \
"{healthChangedTo}.".format(**stats)
self.logger.info(message)
if stats["targetID"] or stats["targetName"]:
if (stats["targetID"] == 160) or (stats["targetName"] == "bob"):
self.logger.debug("bob's got an action!!! sending sms!!")
self.sendSMS(to="+14088963912", body=message)
if (stats["targetID"] == 165) or (stats["targetName"] == "Mabuhay"):
self.logger.debug("bob's got an action!!! sending sms!!")
self.sendSMS(to="+14088963912", body=message)
else:
self.logger.debug("No events detected")
sleep(5)
self.logger.warning("Event has no target!")
else:
self.logger.debug("Queue is empty... No action to take...")
sleep(self.pause)
continue