Skip to content

Instantly share code, notes, and snippets.

@duke79
Created December 12, 2019 11:33
Show Gist options
  • Save duke79/ec27902e8a2fcee9ddf0bfe4bc856e38 to your computer and use it in GitHub Desktop.
Save duke79/ec27902e8a2fcee9ddf0bfe4bc856e38 to your computer and use it in GitHub Desktop.
Slack Bot
# ref : https://github.com/slackapi/python-slackclient
import sys
import uuid
import slack
from lib.py.core.config import Config
slack_token = Config()["slackbot"]["user_token"]
authorized_users = Config()["slackbot"]["authorized_user_ids"]
client = slack.WebClient(slack_token)
console_out = sys.stdout
def print_local(arg):
# console_out.write(arg) #Not working
pass
def users_list():
response = client.users_list()
return response.data["members"]
def send_message(recipient='#random', sender="Unnamed bot", message="Hello!"):
users = [user["id"] for user in users_list()]
if recipient in users: # Direct message to the user
recipient = client.im_open(user=recipient)
recipient = recipient.data["channel"]["id"]
response = client.chat_postMessage(
channel=recipient,
# username=sender,
text=message)
# response = client.chat_postEphemeral(
# user="pulkitsingh01",
# channel='#munich',
# text="Hello world!")
assert response["ok"]
assert response["message"]["text"] == "Hello world!"
fire_requests = {}
def fire_callback(event, payload):
if event == "fireout":
if "stdout" in payload:
fire_out = payload["stdout"].strip()
if len(fire_out) == 0:
return
fire_req_id = payload["req_id"]
send_message(recipient=fire_requests[fire_req_id]["recipient"],
sender="Starter Bot",
message=fire_out)
def run_bot():
"""
Ref: https://api.slack.com/rtm
:return:
"""
import requests
from websocket import WebSocketConnectionClosedException
import json
res = requests.post(url="https://slack.com/api/rtm.connect", data={"token": slack_token})
data = res.json()
ws_url = data["url"]
def on_message(ws, message):
message = json.loads(message)
if "user" not in message:
return
if message["user"] not in authorized_users:
send_message(recipient=message["user"],
message="You are not authorized! Your id is: " + message["user"])
return
# print_local(message)rtm_send_message
if str(message["type"]) == "message":
print_local("%s says: %s" % (message["user"], message["text"]))
# send_message(recipient=message["user"],
# sender="Starter Bot",
# message=message["text"])
from lib.py.cli.fire_cli import fire_task_wrapper
fire_req_id = uuid.uuid4()
fire_requests[fire_req_id] = {
"recipient": message["user"],
"message": message["text"]
}
# fire.Fire(Root, message["text"])
fire_task_wrapper(message["text"], fire_callback, req_id=fire_req_id)
def on_error(ws, error):
print_local(error)
def on_close(ws):
print_local("### closed ###")
def on_open(ws):
print_local("### Bot started ###")
import websocket
while True:
try:
# websocket.enableTrace(True)
ws = websocket.WebSocketApp(ws_url,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.on_open = on_open
ws.run_forever()
except (WebSocketConnectionClosedException, KeyError) as e:
print_local(e)
def main():
print("Starting bot...")
run_bot()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment