Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.env
docker/dev-env.rc
__pycache__/
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

# Dockerfile References: https://docs.docker.com/engine/reference/builder/

# Start from the latest golang base image
FROM python:3.7-slim

COPY requirements.txt .

# Download all dependencies. Dependencies will be cached if the go.mod and go.sum files are not changed
RUN pip install -r ./requirements.txt

# Copy the source from the current directory to the Working Directory inside the container
COPY . .

# Set the Current Working Directory inside the container
WORKDIR /

# Expose port 8000 to the outside world
EXPOSE 8000

# Command to run the executable
CMD python ./bot/bot.py
26 changes: 26 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
DOCKER_IMAGE ?= slackbot
DOCKER_CONTAINER ?= slackbot
HIDE ?= @
PORT ?= 8000
HOSTPORT ?= 8000
NETWORK ?= bridge


build:
$(HIDE)docker build -f Dockerfile -t $(DOCKER_IMAGE) $(PWD)

start:
$(HIDE)docker-compose -f docker/docker-compose.yml up --build $(DOCKER_CONTAINER)

daemon:
$(HIDE)docker-compose -f docker/docker-compose.yml up -d --build $(DOCKER_CONTAINER)

stop:
$(HIDE)docker stop $(DOCKER_CONTAINER)
$(HIDE)docker container rm $(DOCKER_CONTAINER)

rm:
$(HIDE)docker rm $(docker ps -a -q)

rm-all:
$(HIDE)docker system prune
96 changes: 96 additions & 0 deletions bot/bot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import slack
import requests
import json
import os

import workspaceHandlers

# TODO load this from .env docker file
client = slack.WebClient(token=os.environ['VERIFICATION_TOKEN'])
API_DEV_ENDPOINT = 'http://0.0.0.0:8080'
HEADERS = {'Content-Type': 'application/json'}


'''Member will hold all data needed for full member creation
Note that this will also include Discord ID as well
but for now it will be left blank?
'''
class Member:
def __init__(self, slackID, slackName, discordID=''):
self.slackID = slackID
self.slackName = slackName
self.discordID = discordID

def toJSON(self):
dvcMemberStruct = {
'Name': self.slackName,
'SlackUserID': self.slackID,
'DiscordUserID': '',
'CreatedFrom': '',
}
jsonData = json.dumps(dvcMemberStruct)
return jsonData


def postChatMessage(message):
client.chat_postMessage(channel='CT1R99NER',
text=message)

# Gets master json response of all users in slack workspace
def getAllSlackUsers():
members = client.users_list()
return members['members']

def getSlackUserIDs():
slackUsers = getAllSlackUsers()
slackIDs = set()
for id in slackUsers:
slackIDs.add(id['id'])
return slackIDs

def getSlackUserNames():
slackUsers = getAllSlackUsers()
slackFullNames = set()
for name in slackUsers:
slackFullNames.add(name['name'])
return slackFullNames

# Will send relevant data to create member in backend dvc api
# also note that discord data will be left empty for now
def sendNamesToDVC_API():
#slackUserIDs = getSlackUserIDs()
slackUserNames = getSlackUserNames()

#for user_id in slackUserIDs:
# for name in slackUserNames:
# dvcMember = Member(user_id, name)
# memberJSON = json.dumps(dvcMember.toJSON())
# apiReq = requests.post(API_DEV_ENDPOINT + '/member/create',
# data=memberJSON,
# headers=HEADERS)
# print(apiReq.text)
#apiReq = requests.get(API_DEV_ENDPOINT + '/name/show')
jsonData = {'name': 'hennyg#'}
apiReq = requests.post(API_DEV_ENDPOINT + '/name/create',
data=jsonData,
headers=HEADERS)
print(apiReq.text)
print(slackUserNames)


if __name__ == "__main__":
# sendNamesToDVC_API()
hireoutEvent1 = workspaceHandlers.Hireout(
"#slackbot-test",
"Sungod hireout created",
"March 15th",
"Full DJ Packake"
)

officeGear1 = workspaceHandlers.OfficeEquipmentTracker(
hireoutEvent1,
"In office",
"Pioneer CDJ Nexus 2",
"CDJ Player"
)
officeGear1.sendMessageJSON()
131 changes: 131 additions & 0 deletions bot/jsonModels.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@


# (1) new hireout notification
def makeNotifTitleBlock(titleText):
notification_title_block = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": titleText
}
}
return notification_title_block

def makeTextBlock(text):
text_body_block = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": text
}
}

def makeNotifBodyBlock(theme, time, notes, package, djs):
notification_body_block = {
"type":
"section",
"fields": [{
"type": "mrkdwn",
"text": "*Theme:*\n" + theme
}, {
"type": "mrkdwn",
"text": "*When:*\n" + time
}, {
"type": "mrkdwn",
"text": "*Notes:*\n" + notes
}, {
"type": "mrkdwn",
"text": "*Package:*\n" + package
}, {
"type": "mrkdwn",
"text": "*DJs:*\n" + djs
}]
}
return notification_body_block


# TODO Need to hook this up to api call to golang server
def makeEditButton(style="primary"):
edit_button_block = {
"type": "button",
"text": {
"type": "plain_text",
"text": "Edit"
},
"style": style,
"value": "click_me_123"
}
return edit_button_block


def makeActionBlocks():
actions = {
"type":
"actions",
"elements": [
makeEditButton()
],
}
return actions


# Static select dropdown menu
def makeDropDownMenu(gearText):
actions = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": gearText,
},
"accessory": {
"type": "static_select",
"placeholder": {
"type": "plain_text",
"text": "Manage Gear"
},
"options": [
{
"text": {
"type": "plain_text",
"text": "DEFAULT_TEXT"
},
"value": "value-0"
}
]
}
}
return actions

def makeSignupSection(djSetTime=""):
signupArea = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*{}*".format(djSetTime)
},
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "Choose"
},
"value": "click_me_123"
}
}
return signupArea


def makeSpacer():
divider = {
"type": "divider"
}
return divider


def insertImageHorizontally(img_url):
image = {
"type": "image",
"image_url": img_url,
"alt_text": "calendar image link"
}
return image
Loading