Skip to content

Instantly share code, notes, and snippets.

@mugithi
Created August 20, 2017 15:36
Show Gist options
  • Save mugithi/25d5a999be85d0e0787058ba2e69b69e to your computer and use it in GitHub Desktop.
Save mugithi/25d5a999be85d0e0787058ba2e69b69e to your computer and use it in GitHub Desktop.
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