Created
August 20, 2017 15:36
-
-
Save mugithi/25d5a999be85d0e0787058ba2e69b69e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import time | |
from slackclient import SlackClient | |
import requests | |
import json | |
import base64 | |
from pymongo import MongoClient | |
import json | |
from bson.json_util import dumps | |
import copy | |
import logging | |
import pdb | |
logging.basicConfig(level=logging.DEBUG) | |
class erpTaskClass(object): | |
def __init__(self): | |
##test variable | |
self.encodedTask = 'QWN0aXZpdHlJRCBPd25lciBTdWJqZWN0IENvbXBhbnkgTmFtZSBPcHB0eSBOYW1lIENhdGVnb3J5IFR5cGUgQXNzaWduIFN0YXR1cyBTdGFydCBEYXRlIEVuZCBEYXRlIEhyCjkyNDY3MyBJc2FhY2sgS2FyYW5qYSBJbnN0YWxsIERlbW8gb2YgVGludHJpIEhXIGluIE9QZW5TdGFjayBQIFsuLi5dIERhc2hlciBUZWNobm9sb2dpZXMgVGFzayBJbnRlcm5hbCBQcm9qZWN0IEFjY2VwdGVkIDExLzI1LzIwMTYgMjAKOTI0OTI4IElzYWFjayBLYXJhbmphIGNyZWF0ZSBTT1cgYW5kIHF1b3RlIFBhcmFtaXQgQ29ycG9yYXRpb24gVGFzayBDcmVhdGUgU09XIEFjY2VwdGVkIDExLzMwLzIwMTYgMgo5MjU1MzcgSXNhYWNrIEthcmFuamEgQ3JlYXRlIFNPVyAtIHZTQU4gcHJvamVjdCBBbm9tYWxpIFRhc2sgQ3JlYXRlIFNPVyBBY2NlcHRlZCAxMi8yMS8yMDE2IDIKOTI1NjE3IElzYWFjayBLYXJhbmphIFNldHVwIGEgVk1XYXJlIEVudmlyb25tZW50IHRvIGFjY2VzcyB0aGUgWy4uLl0gRGFzaGVyIFRlY2hub2xvZ2llcyBUYXNrIEludGVybmFsIFByb2plY3QgQWNjZXB0ZWQgMS8yMC8yMDE3IDQKOTI1Nzc1IElzYWFjayBLYXJhbmphIENyZWF0ZSBWTSBiYWNrdXAvcmVzdG9yZSBhbmQgQ2xvdWQgb3B0aW8gWy4uLl0gQmFsYml4IFRhc2sgUHJlc2FsZXMgRW5naW5lZXJpbmcgQWNjZXB0ZWQgMTIvOC8yMDE2IDMKOTI1ODE3IElzYWFjayBLYXJhbmphIENlbnRyYWwgRkxvcmlkYSBFeHByZXNzd2F5IENGWCBPcHBvcnR1bmkgWy4uLl0gQ2VudHJhbCBGbG9yaWRhIEV4cHJlc3N3YXkgQXV0aG9yaXR5IFJYMjgwMCBNU0EyMDQwIGFuZCBGQyBTd2l0Y2hlcyBUYXNrIFByZXNhbGVzIEVuZ2luZWVyaW5nIEFjY2VwdGVkIDEyLzEzLzIwMTYgMQo5MjU4MjQgSXNhYWNrIEthcmFuamEgTmVhciBMaW5lIFN0b3JhZ2UgUmV2aWV3IFIuUy4gSHVnaGVzIEV2ZW50IFByZXNhbGVzIEVuZ2luZWVyaW5nIEFjY2VwdGVkIDEyLzEzLzIwMTYgMTIvMTMvMjAxNiAxCjkyNjAwOCBJc2FhY2sgS2FyYW5qYSBzdXBwb3J0IEVudGVmeSBDaGFuZ2VzIEVudGVmeSBJbmZyYXN0cnVjdHVyZSBVcGdyYWRlcyBUYXNrIFByZXNhbGVzIEVuZ2luZWVyaW5nIEFjY2VwdGVkIDEyLzIwLzIwMTYgMQo5MjYwMzUgSXNhYWNrIEthcmFuamEgSW50ZXJtb2xlY3VsYXIgfCBEYXNoZXIgLSBFbmRwb2ludCAmIERSIFsuLi5dIEludGVybW9sZWN1bGFyIEVuZHBvaW50IFByb3RlY3Rpb24gRXZlbnQgQ2xpZW50IE1lZXRpbmcgQWNjZXB0ZWQgMS81LzIwMTcgMS81LzIwMTcgMgo5MjYwNzMgSXNhYWNrIEthcmFuamEgQ2FsbCB0byBEaXNjdXNzIEFXUyBDb25zdWx0aW5nIFNlcnZpY2VzIFsuLi5dIFZlbG9keW5lIEV2ZW50IENsaWVudCBNZWV0aW5nIFBlbmRpbmcgMTIvMjEvMjAxNiAxMi8yMS8yMDE2IDAuNQo5MjYwODQgSXNhYWNrIEthcmFuamEgQ3JlYXRlIFNPVyAtIEFXUyBDb25zdWx0aW5nIFNlcnZpY2VzIFZlbG9keW5lIFRhc2sgQ3JlYXRlIFNPVyBQZW5kaW5nIDEyLzIzLzIwMTYgMg==' | |
##Configurable Variables | |
self.SLACK_BOT_TOKEN = 'xoxb-169813147714-7NsqYRnv8ZUFjBkadSHswcYh' | |
self.slack_client = SlackClient(self.SLACK_BOT_TOKEN) | |
self.BOT_NAME = 'erp' | |
self.BOT_ID = self.getBotID() | |
self.uri = "localhost" | |
self.port = 27017 | |
client = MongoClient(self.uri, self.port) | |
self.db = client.myMongoDB | |
#Application Variables | |
self.taskTemplateDictionary = { 'Task_ID' : '0,1','Name' : '1,3', 'Subject' :'3,-9', 'Company' : '-9,-7', 'Category': '-7,-6', 'Type': '-6,-4', 'Accepted Status': '-4,-3', 'Start Data': '-3,-2', 'End Date': '-2,-1'} | |
self.response = [ | |
{ | |
"fallback": "broken", | |
"author_name": "Rob Michaelis", | |
"text": "<http://hq-iis-prod01/Apps/ERP/Activity/ActivityInfo.asp?ActivityID=925617|925617>", | |
"fields": [ | |
{ | |
"title": "Category", | |
"value": "Task", | |
"short": "true" | |
}, | |
{ | |
"title": "Company", | |
"value": "Dasher Technologies", | |
"short": 'true' | |
}, | |
{ | |
"title": "Accepted Status", | |
"value": "Accepted", | |
"short": 'true' | |
}, | |
{ | |
"title": "Due Date", | |
"value": "11/25/2016", | |
"short": 'true' | |
}, | |
{ | |
"title": "Subject", | |
"value": "<http://hq-iis-prod01/Apps/ERP/Activity/ActivityInfo.asp?ActivityID=925617|Install Demo of Tintri HW in OPenStack P [...]>", | |
"short": 'false' | |
} | |
], | |
"color": "#F35A00" | |
} | |
] | |
if __name__ == "__main__": | |
READ_WEBSOCKET_DELAY = 1 # 1 second delay between reading from firehose | |
if self.slack_client.rtm_connect(): | |
print("StarterBot connected and running!") | |
while True: | |
command, channel = self.parseSlackOutput(self.slack_client.rtm_read()) | |
if command and channel: | |
self.handleCommand(command, channel) | |
time.sleep(READ_WEBSOCKET_DELAY) | |
else: | |
print("Connection failed. Invalid Slack token or bot ID?") | |
# SLACK function: | |
# Retrieve all users so we can find our bot | |
def getBotID(self): | |
api_call = self.slack_client.api_call("users.list") | |
if api_call.get('ok'): | |
# retrieve all users so we can find our bot | |
users = api_call.get('members') | |
for user in users: | |
if 'name' in user and user.get('name') == self.BOT_NAME: | |
return user.get('id') | |
else: | |
print("could not find bot user with the name " + self.BOT_NAME) | |
def parseSlackOutput(self, slack_rtm_output): | |
AT_BOT = "<@" + self.BOT_ID + ">" | |
""" | |
The Slack Real Time Messaging API is an events firehose. | |
this parsing function returns None unless a message is | |
directed at the Bot, based on its ID. | |
""" | |
output_list = slack_rtm_output | |
if output_list and len(output_list) > 0: | |
for output in output_list: | |
if output and 'text' in output and AT_BOT in output['text']: | |
# return text after the @ mention, whitespace removed | |
return output['text'].split(AT_BOT)[1].strip().lower(), \ | |
output['channel'] | |
return None, None | |
def handleCommand(self, command, channel): | |
EXAMPLE_COMMAND = "@erp" | |
# Receives commands directed at the bot and determines if they | |
# are valid commands. If so, then acts on the commands. If not, | |
# returns back what it needs for clarification. | |
text = "" | |
response = "" | |
# pdb.set_trace() | |
if command.startswith("testselenium"): | |
text = requests.get('http://localhost:5000/etest').text | |
elif command.startswith("testdbselenium"): | |
self.emptyDB() | |
self.refreshDB(requests.get('http://localhost:5000/etest').text) | |
response = self.formatTasksForSlack(self.listAllTasks()) | |
elif command.startswith("testdb"): | |
self.emptyDB() | |
self.refreshDB(self.encodedTask) | |
response = self.formatTasksForSlack(self.listAllTasks()) | |
elif command.startswith('testaccepted'): | |
response = self.formatTasksForSlack(self.tasksWithStatus("accepted")) | |
elif command.startswith('testpending'): | |
response = self.formatTasksForSlack(self.tasksWithStatus("Pending")) | |
else: | |
text = """You can run the following tests using the commands | |
testDBSelenium: check you can pull data from selenium, store it in MongoDb and retrieve it | |
testDB: check that you can storeData in MongoDb and retrive it | |
testSelenium: check that you can transfer data from selenium and write it on slack """ | |
# else: | |
# text = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \ | |
# "* command with numbers, delimited by spaces." | |
if not response: | |
self.slack_client.api_call("chat.postMessage", channel=channel, text=text, as_user=True) | |
else: | |
self.slack_client.api_call("chat.postMessage", channel=channel, text='', attachments=response, as_user=True) | |
# DB function: Decode input received from selenium and convert it into of listAllTasks | |
def decodeFunc(self, encodedTask): | |
return base64.b64decode(encodedTask).decode("utf-8").split("\n") | |
## DB function: Write to MongoDB All new tasks | |
def refreshDB(self, encodedTask): | |
for i in range(len(self.decodeFunc(encodedTask)))[1:]: #Fix decode function, you are calling it too may times | |
if self.decodeFunc(encodedTask)[i].split(" ")[-3]=="Pending": | |
tasku = self.decodeFunc(encodedTask)[i].encode("ascii").decode('utf-8').split(' ') | |
tasku.insert(-2, "NULL") | |
self.db.myMongoDB.insert_one(self.jsonifyObject(tasku)).inserted_id | |
elif self.decodeFunc(encodedTask)[i].split(" ")[-3]=="Accepted": | |
tasku = self.decodeFunc(encodedTask)[i].encode("ascii").decode('utf-8').split(' ') | |
tasku.insert(-2, "NULL") | |
self.db.myMongoDB.insert_one(self.jsonifyObject(tasku)).inserted_id | |
else: | |
tasku = self.decodeFunc(encodedTask)[i].encode("ascii").decode('utf-8').split(' ') | |
self.db.myMongoDB.insert_one(self.jsonifyObject(tasku)).inserted_id | |
## DB function: Refresh DB and clean it up | |
def emptyDB(self): | |
return self.db.myMongoDB.delete_many({}) | |
## DB function: | |
def listAllTasks(self): | |
listAllTasks = self.db.myMongoDB.find() | |
return listAllTasks | |
#DB function: | |
def taskWithTaskID(self, taskID): | |
taskWithTaskID = self.db.myMongoDB.find({"Task_ID": taskID}) | |
return taskWithTaskID | |
#DB function: | |
def tasksWithStatus(self, status): | |
tasksWithStatus = self.db.myMongoDB.find({"Accepted Status": status}) | |
return tasksWithStatus | |
## DB function: Put titles to all the tasks received from the json Object | |
def jsonifyObject(self, tasks): | |
self.tasks = tasks | |
jsonified = {} | |
for keys,values in self.taskTemplateDictionary.items(): | |
p=slice(int(values.split(",")[0]),int(values.split(",")[1])) | |
jsonified.update({keys : ' '.join(self.tasks[p])}) | |
return jsonified | |
## For loop that fill ins in the field values in the jsonified task operator | |
def formatTasksForSlack(self, dbTasks): | |
count = 0 | |
pdb.set_trace() | |
self.author_name = "Thomas Edison" | |
for task in json.loads(dumps(dbTasks)): | |
self.response[count]['author_name'] = self.author_name | |
self.response[count]['text']='<http://hq-iis-prod01/Apps/ERP/Activity/ActivityInfo.asp?ActivityID='+task['Task_ID']+"|"+task['Task_ID']+">" | |
self.response[count]['fields'][0]['value']=task['Category'] | |
self.response[count]['fields'][1]['value']=task['Company'] | |
self.response[count]['fields'][2]['value']=task['Accepted Status'] | |
self.response[count]['fields'][3]['value']=task['End Date'] | |
self.response[count]['fields'][4]['value']='<http://hq-iis-prod01/Apps/ERP/Activity/ActivityInfo.asp?ActivityID='+task['Task_ID']+"|"+task['Subject']+">" | |
if task['Accepted Status'] == "Accepted": | |
self.response[count]['color'] = '#28f100' | |
else: | |
self.response[count]['color'] = '#f03000' | |
count = count + 1 | |
self.response.append(copy.deepcopy(self.response[0])) | |
return self.response[1:] | |
class erpUserClass(erpTaskClass): | |
def __init__(self): | |
self.author_name = "isaack Karanja" | |
print("retrive username and password from user and store it in author_name.variable {}").format(self.author_name) | |
super(erpUserClass, self).__init__() | |
def formatTasksForSlack(self, dbTasks, *author): | |
author = self.author_name | |
super(erpUserClass, self).formatTasksForSlack(dbTasks, *author) #copy variables from other classes | |
def getUsername(): | |
# request username from user through slack | |
pass | |
def writeToUserDB(): | |
#write that information to db, store user information too | |
pass | |
isaackKaranja = erpUserClass | |
isaackKaranja.author_name = "Isaack Karanja" | |
isaackKaranja() | |
# print(help(isaackKaranja())) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment