mirror of
https://github.com/MrDetonia/Maki.git
synced 2024-11-22 20:00:00 -05:00
Added .markov command that generates markov chain sentences based on a user's chat history, v0.10.0
This commit is contained in:
parent
0374e88f94
commit
360705a04c
20
bot.py
20
bot.py
@ -12,6 +12,7 @@ import os
|
|||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
|
import markov
|
||||||
|
|
||||||
# file in this directory called "secret.py" should contain these variables
|
# file in this directory called "secret.py" should contain these variables
|
||||||
from secret import email,pwd
|
from secret import email,pwd
|
||||||
@ -23,7 +24,7 @@ from secret import email,pwd
|
|||||||
name = "Maki"
|
name = "Maki"
|
||||||
|
|
||||||
# bot version
|
# bot version
|
||||||
version = "v0.9.4"
|
version = "v0.10.0"
|
||||||
|
|
||||||
# text shown by .help command
|
# text shown by .help command
|
||||||
helptext = """I am a bot written in Python by MrDetonia
|
helptext = """I am a bot written in Python by MrDetonia
|
||||||
@ -40,6 +41,7 @@ My commands are:
|
|||||||
.seen <user> - prints when user was last seen
|
.seen <user> - prints when user was last seen
|
||||||
.tell <user> <message> - send message to user when they are next active
|
.tell <user> <message> - send message to user when they are next active
|
||||||
.say <msg> - say something
|
.say <msg> - say something
|
||||||
|
.markov <user> - generate sentence using markov chains over a user's chat history
|
||||||
```"""
|
```"""
|
||||||
|
|
||||||
# IDs of admin users
|
# IDs of admin users
|
||||||
@ -145,6 +147,8 @@ def on_message(message):
|
|||||||
# print messages to terminal for info
|
# print messages to terminal for info
|
||||||
print(message.author.name + ': ' + message.content)
|
print(message.author.name + ': ' + message.content)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ensure we store this user's ID
|
# ensure we store this user's ID
|
||||||
if message.author.name not in users:
|
if message.author.name not in users:
|
||||||
users[message.author.name] = message.author.id
|
users[message.author.name] = message.author.id
|
||||||
@ -252,12 +256,26 @@ def on_message(message):
|
|||||||
# echo message
|
# echo message
|
||||||
yield from client.send_message(message.channel, message.content[5:])
|
yield from client.send_message(message.channel, message.content[5:])
|
||||||
|
|
||||||
|
elif message.content.startswith('.markov'):
|
||||||
|
# generate a markov chain sentence based on the user's chat history
|
||||||
|
tmp = message.content[8:].split(' ',1)
|
||||||
|
if os.path.isfile('./markovs/' + users[tmp[0]]):
|
||||||
|
mc = markov.Markov(open('./markovs/' + users[tmp[0]]))
|
||||||
|
yield from client.send_message(message.channel, mc.generate_text())
|
||||||
|
else:
|
||||||
|
yield from client.send_message(message.channel, 'I haven\'t seen that user speak yet!')
|
||||||
|
|
||||||
|
# Stuff that happens when message is not a bot command:
|
||||||
else:
|
else:
|
||||||
# log each message against users
|
# log each message against users
|
||||||
history[message.author.name] = (message.content, time.time())
|
history[message.author.name] = (message.content, time.time())
|
||||||
with open('hist.json', 'w') as fp:
|
with open('hist.json', 'w') as fp:
|
||||||
json.dump(history, fp)
|
json.dump(history, fp)
|
||||||
|
|
||||||
|
# log user messages for markov chains
|
||||||
|
with open('./markovs/' + message.author.id, 'a') as fp:
|
||||||
|
fp.write('\n' + message.content)
|
||||||
|
|
||||||
# Ben meme trackers
|
# Ben meme trackers
|
||||||
if '/ck/' in message.content and message.author.name == "Ben.H":
|
if '/ck/' in message.content and message.author.name == "Ben.H":
|
||||||
bentrack['ck'] += 1
|
bentrack['ck'] += 1
|
||||||
|
42
markov.py
Normal file
42
markov.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
class Markov(object):
|
||||||
|
|
||||||
|
def __init__(self, open_file):
|
||||||
|
self.cache = {}
|
||||||
|
self.open_file = open_file
|
||||||
|
self.words = self.file_to_words()
|
||||||
|
self.word_size = len(self.words)
|
||||||
|
self.database()
|
||||||
|
|
||||||
|
def file_to_words(self):
|
||||||
|
self.open_file.seek(0)
|
||||||
|
data = self.open_file.read()
|
||||||
|
words = data.split()
|
||||||
|
return words
|
||||||
|
|
||||||
|
def triples(self):
|
||||||
|
if len(self.words) < 3:
|
||||||
|
return
|
||||||
|
|
||||||
|
for i in range(len(self.words) - 2):
|
||||||
|
yield (self.words[i], self.words[i+1], self.words[i+2])
|
||||||
|
|
||||||
|
def database(self):
|
||||||
|
for w1, w2, w3 in self.triples():
|
||||||
|
key = (w1, w2)
|
||||||
|
if key in self.cache:
|
||||||
|
self.cache[key].append(w3)
|
||||||
|
else:
|
||||||
|
self.cache[key] = [w3]
|
||||||
|
|
||||||
|
def generate_text(self, size=25):
|
||||||
|
seed = random.randint(0, self.word_size - 3)
|
||||||
|
seed_word, next_word = self.words[seed], self.words[seed+1]
|
||||||
|
w1, w2 = seed_word, next_word
|
||||||
|
gen_words = []
|
||||||
|
for i in range(size):
|
||||||
|
gen_words.append(w1)
|
||||||
|
w1, w2 = w2, random.choice(self.cache[(w1, w2)])
|
||||||
|
gen_words.append(w2)
|
||||||
|
return ' '.join(gen_words)
|
2
markovs/.gitignore
vendored
Normal file
2
markovs/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
Loading…
Reference in New Issue
Block a user