Created
December 12, 2019 11:33
-
-
Save duke79/ec27902e8a2fcee9ddf0bfe4bc856e38 to your computer and use it in GitHub Desktop.
Slack Bot
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
# 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