10 changed files with 186 additions and 204 deletions
@ -0,0 +1,12 @@ |
|||
[[source]] |
|||
name = "pypi" |
|||
url = "https://pypi.org/simple" |
|||
verify_ssl = true |
|||
|
|||
[dev-packages] |
|||
|
|||
[packages] |
|||
slackclient = "*" |
|||
|
|||
[requires] |
|||
python_version = "3.7" |
@ -0,0 +1,134 @@ |
|||
{ |
|||
"_meta": { |
|||
"hash": { |
|||
"sha256": "7cbe5be898916ef05dcff196ada03f05a4876ea4138e116d9fddd22ebfb7053c" |
|||
}, |
|||
"pipfile-spec": 6, |
|||
"requires": { |
|||
"python_version": "3.7" |
|||
}, |
|||
"sources": [ |
|||
{ |
|||
"name": "pypi", |
|||
"url": "https://pypi.org/simple", |
|||
"verify_ssl": true |
|||
} |
|||
] |
|||
}, |
|||
"default": { |
|||
"aiohttp": { |
|||
"hashes": [ |
|||
"sha256:00d198585474299c9c3b4f1d5de1a576cc230d562abc5e4a0e81d71a20a6ca55", |
|||
"sha256:0155af66de8c21b8dba4992aaeeabf55503caefae00067a3b1139f86d0ec50ed", |
|||
"sha256:09654a9eca62d1bd6d64aa44db2498f60a5c1e0ac4750953fdd79d5c88955e10", |
|||
"sha256:199f1d106e2b44b6dacdf6f9245493c7d716b01d0b7fbe1959318ba4dc64d1f5", |
|||
"sha256:296f30dedc9f4b9e7a301e5cc963012264112d78a1d3094cd83ef148fdf33ca1", |
|||
"sha256:368ed312550bd663ce84dc4b032a962fcb3c7cae099dbbd48663afc305e3b939", |
|||
"sha256:40d7ea570b88db017c51392349cf99b7aefaaddd19d2c78368aeb0bddde9d390", |
|||
"sha256:629102a193162e37102c50713e2e31dc9a2fe7ac5e481da83e5bb3c0cee700aa", |
|||
"sha256:6d5ec9b8948c3d957e75ea14d41e9330e1ac3fed24ec53766c780f82805140dc", |
|||
"sha256:87331d1d6810214085a50749160196391a712a13336cd02ce1c3ea3d05bcf8d5", |
|||
"sha256:9a02a04bbe581c8605ac423ba3a74999ec9d8bce7ae37977a3d38680f5780b6d", |
|||
"sha256:9c4c83f4fa1938377da32bc2d59379025ceeee8e24b89f72fcbccd8ca22dc9bf", |
|||
"sha256:9cddaff94c0135ee627213ac6ca6d05724bfe6e7a356e5e09ec57bd3249510f6", |
|||
"sha256:a25237abf327530d9561ef751eef9511ab56fd9431023ca6f4803f1994104d72", |
|||
"sha256:a5cbd7157b0e383738b8e29d6e556fde8726823dae0e348952a61742b21aeb12", |
|||
"sha256:a97a516e02b726e089cffcde2eea0d3258450389bbac48cbe89e0f0b6e7b0366", |
|||
"sha256:acc89b29b5f4e2332d65cd1b7d10c609a75b88ef8925d487a611ca788432dfa4", |
|||
"sha256:b05bd85cc99b06740aad3629c2585bda7b83bd86e080b44ba47faf905fdf1300", |
|||
"sha256:c2bec436a2b5dafe5eaeb297c03711074d46b6eb236d002c13c42f25c4a8ce9d", |
|||
"sha256:cc619d974c8c11fe84527e4b5e1c07238799a8c29ea1c1285149170524ba9303", |
|||
"sha256:d4392defd4648badaa42b3e101080ae3313e8f4787cb517efd3f5b8157eaefd6", |
|||
"sha256:e1c3c582ee11af7f63a34a46f0448fca58e59889396ffdae1f482085061a2889" |
|||
], |
|||
"version": "==3.5.4" |
|||
}, |
|||
"async-timeout": { |
|||
"hashes": [ |
|||
"sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", |
|||
"sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" |
|||
], |
|||
"version": "==3.0.1" |
|||
}, |
|||
"attrs": { |
|||
"hashes": [ |
|||
"sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", |
|||
"sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" |
|||
], |
|||
"version": "==19.1.0" |
|||
}, |
|||
"chardet": { |
|||
"hashes": [ |
|||
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", |
|||
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" |
|||
], |
|||
"version": "==3.0.4" |
|||
}, |
|||
"idna": { |
|||
"hashes": [ |
|||
"sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", |
|||
"sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" |
|||
], |
|||
"version": "==2.8" |
|||
}, |
|||
"multidict": { |
|||
"hashes": [ |
|||
"sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f", |
|||
"sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3", |
|||
"sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef", |
|||
"sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b", |
|||
"sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73", |
|||
"sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc", |
|||
"sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3", |
|||
"sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd", |
|||
"sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351", |
|||
"sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941", |
|||
"sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d", |
|||
"sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1", |
|||
"sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b", |
|||
"sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a", |
|||
"sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3", |
|||
"sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7", |
|||
"sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0", |
|||
"sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0", |
|||
"sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014", |
|||
"sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5", |
|||
"sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036", |
|||
"sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d", |
|||
"sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a", |
|||
"sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce", |
|||
"sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1", |
|||
"sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a", |
|||
"sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9", |
|||
"sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7", |
|||
"sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b" |
|||
], |
|||
"version": "==4.5.2" |
|||
}, |
|||
"slackclient": { |
|||
"hashes": [ |
|||
"sha256:ed0f60dd5a646b4ccd31ec1f11503b8689850894681e6baae2bc06b941fc1c58", |
|||
"sha256:eeb0dad774f6661f7504d80d8a22deadadb941b840e7a0719b5b92d4d84f9015" |
|||
], |
|||
"index": "pypi", |
|||
"version": "==2.1.0" |
|||
}, |
|||
"yarl": { |
|||
"hashes": [ |
|||
"sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9", |
|||
"sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f", |
|||
"sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb", |
|||
"sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320", |
|||
"sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842", |
|||
"sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0", |
|||
"sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829", |
|||
"sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310", |
|||
"sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4", |
|||
"sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8", |
|||
"sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1" |
|||
], |
|||
"version": "==1.3.0" |
|||
} |
|||
}, |
|||
"develop": {} |
|||
} |
@ -0,0 +1,21 @@ |
|||
FROM python:3.7-alpine |
|||
LABEL maintainer "me@jowj.net" |
|||
|
|||
RUN apk update |
|||
|
|||
RUN apk add \ |
|||
python3 \ |
|||
python3-dev \ |
|||
libffi-dev |
|||
|
|||
RUN apk add --no-cache curl python pkgconfig python-dev openssl-dev libffi-dev musl-dev make gcc |
|||
|
|||
RUN pip3 install --upgrade pip |
|||
|
|||
RUN pip3 install --upgrade setuptools |
|||
|
|||
COPY ./ ./mojo/ |
|||
|
|||
RUN pip3 install requests slackclient |
|||
|
|||
CMD python3 /mojo/mojo-web.py |
@ -1,195 +0,0 @@ |
|||
import os |
|||
import time |
|||
import re |
|||
import logging |
|||
import json |
|||
|
|||
from pathlib import Path |
|||
from slackclient import SlackClient |
|||
from json import JSONDecoder |
|||
from random import randint |
|||
from functools import partial |
|||
|
|||
# instantiate Slack client |
|||
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN')) |
|||
# starterbot's user ID in Slack: value is assigned after the bot starts up |
|||
starterbot_id = None |
|||
# channel i want to get ID from |
|||
bot_channel = "inmyimo" |
|||
|
|||
# constants |
|||
RTM_READ_DELAY = 1 # 1 second delay between reading from RTM |
|||
EXAMPLE_COMMAND = "do" |
|||
MENTION_REGEX = "^<@(|[WU].+)>(.*)" |
|||
|
|||
|
|||
def parse_bot_commands(slack_events): |
|||
""" |
|||
Parses a list of events coming from the Slack RTM API to find bot commands. |
|||
If a bot command is found, this function returns a tuple of command and channel. |
|||
If its not found, then this function returns None, None. |
|||
""" |
|||
if event["type"] == "message" and not "subtype" in event: |
|||
user_id, message = parse_direct_mention(event["text"]) |
|||
if user_id == starterbot_id: |
|||
return message, event["channel"] |
|||
return None, None |
|||
|
|||
|
|||
def parse_direct_mention(message_text): |
|||
""" |
|||
Finds a direct mention (a mention that is at the beginning) in message text |
|||
and returns the user ID which was mentioned. If there is no direct mention, returns None |
|||
""" |
|||
matches = re.search(MENTION_REGEX, message_text) |
|||
# the first group contains the username, the second group contains the remaining message |
|||
return (matches.group(1), matches.group(2).strip()) if matches else (None, None) |
|||
|
|||
|
|||
def select_noun(): |
|||
with open('/mjj1/corpora.json', 'r') as infh: |
|||
for data in json_parse(infh): |
|||
upper_Limit = len(data["nouns"]) |
|||
x = randint(0, upper_Limit) |
|||
if data["nouns"][x]: |
|||
return(data["nouns"][x]) |
|||
else: |
|||
return("car") |
|||
|
|||
|
|||
def json_parse(fileobj, decoder=JSONDecoder(), buffersize=2048): |
|||
buffer = '' |
|||
for chunk in iter(partial(fileobj.read, buffersize), ''): |
|||
buffer += chunk |
|||
while buffer: |
|||
try: |
|||
result, index = decoder.raw_decode(buffer) |
|||
yield result |
|||
buffer = buffer[index:] |
|||
except ValueError: |
|||
# Not enough data to decode, read more |
|||
break |
|||
|
|||
|
|||
def handle_command(command, channel): |
|||
""" |
|||
Executes bot command if the command is known |
|||
""" |
|||
# Default response is help text for the user |
|||
default_response = "tell j- to actually fucking write somthing." |
|||
response = None |
|||
|
|||
if command.startswith(EXAMPLE_COMMAND): |
|||
response = "Sure...write some more code then I can do that!" |
|||
if command.startswith("say"): |
|||
response = "you're not my real dad" |
|||
if command.startswith("download"): |
|||
response = "you wouldn't download a %s" % (select_noun()) |
|||
if "arke" in command: |
|||
results_file = Path("/shared/results.json") |
|||
if results_file.is_file(): |
|||
open_file = open(results_file) |
|||
for line in open_file: |
|||
response = line |
|||
else: |
|||
response = "Most recent status failed to write to file :(" |
|||
if "pence" in command.lower(): |
|||
response = "Mother wouldn't want me to say that" |
|||
|
|||
# Sends the response back to the channel |
|||
slack_client.api_call( |
|||
"chat.postMessage", |
|||
channel=channel, |
|||
text=response or default_response |
|||
) |
|||
|
|||
|
|||
def reactable_message(event): |
|||
"""Test whether a (Slack) event is a reaction-able message |
|||
Check whether it's not a DM, it's not empty, and it's actually a message |
|||
""" |
|||
return 'channel' in event and 'text' in event and event.get('type') == 'message' |
|||
|
|||
|
|||
def reactable_string(text): |
|||
"""Return regex objects matching interesting strings |
|||
""" |
|||
reactable_array = [] |
|||
if re.search(r"\bai\b", text.lower()) is not None: |
|||
reactable_array.append('ai') |
|||
if 'furry' in text.lower() or 'furries' in text.lower() or 'fursuit' in text.lower(): |
|||
# no processing needed because: honestly its funnier even if it gets the word boundary wrong. |
|||
reactable_array.append('furry') |
|||
if 'flavor town' in text.lower() or 'flavortown' in text.lower() or 'guy fieri' in text.lower(): |
|||
# no processing needed because: honestly its funnier even if it gets the word boundary wrong. |
|||
reactable_array.append('flavortown') |
|||
return reactable_array |
|||
|
|||
|
|||
def react_to_message(reaction): |
|||
slack_client.api_call( |
|||
'reactions.add', |
|||
channel = get_channel_ID("inmyimo"), |
|||
name = reaction, |
|||
timestamp = event.get('ts') |
|||
) |
|||
|
|||
|
|||
def react_to_monitoring(): |
|||
results_file = Path("/shared/alerts.log") |
|||
does_file_exist = results_file.is_file() |
|||
logging.info(f"file exists: {does_file_exist}") |
|||
if results_file.is_file(): |
|||
open_file = open("/shared/alerts.log","r") |
|||
logging.info('in file exists conditional') |
|||
for line in open_file: |
|||
logging.info('examining item: '+line) |
|||
slack_client.api_call( |
|||
"chat.postMessage", |
|||
channel = get_channel_ID("bots-like-gaston"), |
|||
text = line |
|||
) |
|||
os.remove("/shared/alerts.log") |
|||
|
|||
|
|||
def get_channel_ID(channelName): |
|||
for channel in slack_client.api_call('channels.list')["channels"]: |
|||
if channel["name"] == channelName: |
|||
return channel["id"] |
|||
raise Exception("couldn't find channel requested.") |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
logging.basicConfig(filename='mojojojo.log', level=logging.INFO) |
|||
logging.info('Started') |
|||
results_file = Path("/shared/alerts.log") |
|||
if slack_client.rtm_connect(with_team_state=False): |
|||
print("mojo jojo online, connected, and running!") |
|||
# Read bot's user ID by calling Web API method `auth.test` |
|||
starterbot_id = slack_client.api_call("auth.test")["user_id"] |
|||
while True: |
|||
if results_file.is_file(): |
|||
logging.info("results_file ifstatement passed!") |
|||
react_to_monitoring() |
|||
for event in (slack_client.rtm_read()): |
|||
command, channel = parse_bot_commands(event) |
|||
if command: |
|||
handle_command(command, channel) |
|||
if reactable_message(event): |
|||
channel = event['channel'] |
|||
text = event['text'] |
|||
reactions_needed = reactable_string(text) |
|||
if 'ai' in reactions_needed: |
|||
react_to_message("robot_face") |
|||
if 'furry' in reactions_needed: |
|||
react_to_message("eggplant") |
|||
react_to_message("sweat_drops") |
|||
if 'flavortown' in reactions_needed: |
|||
react_to_message("dark_sunglasses") |
|||
react_to_message("guyfieri") |
|||
time.sleep(RTM_READ_DELAY) |
|||
logging.info("Client worked. No errors (we think lol)") |
|||
else: |
|||
print("Connection failed. Exception traceback printed above.") |
|||
logging.info('Check console for exception traceback.') |
|||
logging.info('Finished') |
Loading…
Reference in new issue