# Maki # ---- # Discord bot by MrDetonia # # Copyright 2018 Zac Herd # Licensed under BSD 3-clause License, see LICENSE.md for more info # IMPORTS import discord import asyncio import os import io import requests import sys import shlex import subprocess import time import datetime import random import re import json import logging # LOCAL IMPORTS from common import * from helpers import * from commands import * from admincommands import * # file in this directory called "secret.py" should contain these variables from secret import token, lfmkey, steamkey # DISCORD CLIENT INSTANCE client = discord.Client() # EVENT HANDLERS # called when client ready @client.event @asyncio.coroutine def on_ready(): # info on terminal print('Connected') print('User: ' + client.user.name) print('ID: ' + client.user.id) # populate D&D spells list for spell in requests.get('http://dnd5eapi.co/api/spells/').json()['results']: spellslist[spell['name']] = spell['url'] # set "Now Playing" to print version game = discord.Game(name=version) yield from client.change_presence(game=game) # called when message received @client.event @asyncio.coroutine def on_message(msg): # print messages to terminal for info timestr = time.strftime('%Y-%m-%d-%H:%M:%S: ') try: print("{} {} - {} | {}: {}".format(timestr, msg.server.name, msg.channel.name, msg.author.name, msg.content)) except AttributeError: print("{} PRIVATE | {}: {}".format(timestr, msg.author.name, msg.content)) # do not parse own messages or private messages if msg.author != client.user and type( msg.channel) is not discord.PrivateChannel: # log each message against users if msg.content != "": history[msg.server.id + msg.author.id] = (msg.server.id, time.time(), msg.content) with open('./persist/hist.json', 'w') as fp: json.dump(history, fp) # log user messages for markov chains, ignoring messages with certain substrings filters = ['`', 'http://', 'https://'] if not any(x in msg.content for x in filters): try: with open('./persist/markovs/' + msg.server.id + '-' + msg.author.id, 'a') as fp: fp.write('\n' + msg.content) except PermissionError: pass # react to stuff yield from makireacts(client, msg) # check for commands if msg.content.startswith(prefix): cmd = msg.content.split(' ', 1)[0][1:] if cmd in commands: yield from commands[cmd](client, msg) elif cmd in admincommands and msg.author.id in admins: yield from admincommands[cmd](client, msg) # MAIN FUNCTION def main(): logger() client.run(token) exit(0) if __name__ == "__main__": main()