From 6682510176a0894400239e83b0a6c9773b2a826b Mon Sep 17 00:00:00 2001 From: vylion Date: Thu, 21 Sep 2017 17:25:18 +0200 Subject: [PATCH] Uploading Velasco v1.4.1 - More modularity - Improved echo --- __pycache__/chatlog.cpython-36.pyc | Bin 2176 -> 2267 bytes __pycache__/markov.cpython-36.pyc | Bin 2478 -> 2702 bytes __pycache__/velasco.cpython-36.pyc | Bin 0 -> 5983 bytes chatlog.py | 4 + markov.py | 10 +- ocsalev.py | 180 +++++++++++++++++++++++++++++ velasco.py | 20 ++-- 7 files changed, 206 insertions(+), 8 deletions(-) create mode 100644 __pycache__/velasco.cpython-36.pyc create mode 100644 ocsalev.py diff --git a/__pycache__/chatlog.cpython-36.pyc b/__pycache__/chatlog.cpython-36.pyc index 2783f7e1bfb07dee82fc92b8341bfe838452a044..123c799b9848a933864a40cd9da52ebb800c0c38 100644 GIT binary patch delta 554 zcmZvYJ4*vW5XWbB?{a(5Xc8Zg#up-7;R7s08xhgYGy%a_1j$CdBPO!9qJ$HLXk#bm z7ZDo^J1aZu_zCXAnFXwXE!?)MH$$Ni)Xcqt)P(=+@p-1n{ zMy{wwZlF4#u>!%^4E_U5Zp}j~_ ztTfyT{&y*@6S;}(Vj^mpL{#9vDbztaxa04%3QZ>|e)-cOt-9mtux{53QeaAq4B=C< zH^rVy2)tf4K5d4!8MYd+;bc#SEo)}TGeaEuho*f}i{f_640DHLikzF}TzcTmUvU+n z!a#FAeDan}vY3}xa3I2jYy||=&_X2WO^98@?;By6 zmgcF}9@EelqDyUO&#VGy6PM0e}|NP(Y1|%uF6x zSOq`(^8R38?d{b3#PJigM9_gLj4(oh9td{LGA^+XbzIUf7U#rBX>E^+-=6MpzoU%InG^4831hzuO4HLi4Jjy1h0T%RXN? zgMK$q-5_iY7FJ&dp_1CaFm$!8lTw75eJOi4_0FId%5~DdDKq+SNB_<9@nT6!K#ps4 zb}>V@$v6((}eF|&wMktny&XAxCD+)nj4&RlW1^z H{>aPUSs-c~ diff --git a/__pycache__/markov.cpython-36.pyc b/__pycache__/markov.cpython-36.pyc index 84c06664a0416f5a6a0fc1c5000a4b414e3b1507..9644ffb8483d5503f2d415d816d76f27de3a73c4 100644 GIT binary patch delta 346 zcmZ1{+$YLq%*)I5>gwT0Mb3>}70i4d3=9mZ3{i|J3{gxeLX#&jYl;h}@TKs#Fh+5t z2&4$MFhp^tFa|SdicCJitiqMaP{R<n?Nd1gt5FOXXdl4W3IW8`7vViaSl67Wqd%FZv-gDcWx@^jN=7^65+ z7=sx!g(hEMR^h5)D%Qzls9}g_nEa1fj791|Q#3gzujX`~ Z{Fzghp9je0VC3TDU(E#xd8SM8WaEk diff --git a/__pycache__/velasco.cpython-36.pyc b/__pycache__/velasco.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a24ab378f9e8ca62182efdad889e80bd0e3c57b GIT binary patch literal 5983 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 L{tQO17TJFRWwR#f literal 0 HcmV?d00001 diff --git a/chatlog.py b/chatlog.py index a1eed2a..7da5994 100644 --- a/chatlog.py +++ b/chatlog.py @@ -59,3 +59,7 @@ class Chatlog(object): return new_log else: return Chatlog(lines[0], lines[1], lines[2], lines[4:], int(lines[3])) + + def fuse_with(chatlog): + self.count += chatlog.count + self.gen.fuse_with(chatlog.gen) diff --git a/markov.py b/markov.py index 3e39383..f8b42aa 100644 --- a/markov.py +++ b/markov.py @@ -30,8 +30,8 @@ def triples(wordlist): class Markov(object): def __init__(self, text=None, from_json=False): + self.cache = {} if not from_json: - self.cache = {} if text is not None: for line in text: self.add_text(line) @@ -73,3 +73,11 @@ class Markov(object): else: w1, w2 = w2, random.choice(self.cache[getkey(w1, w2)]) return ' '.join(gen_words) + + def fuse_with(self, gen): + d = gen.cache + for key in gen.cache: + if key in self.cache: + self.cache[key].extend(d[key]) + else: + self.cache[key] = list(d[key]) diff --git a/ocsalev.py b/ocsalev.py new file mode 100644 index 0000000..7d9e80b --- /dev/null +++ b/ocsalev.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 + +# FAILED ATTEMPT TO MAKE BOT THAT USES VELASCO MEMORY IN ALL GROUPS SIMULTANEOUSLY + +import sys, os +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters +from telegram.error import * +from markov import * +from velasco import GUILLERMO_ID, LOG_DIR, LOG_EXT +import logging +import argparse + +# Enable logging +logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + level=logging.INFO) + +logger = logging.getLogger(__name__) + +generator = Markov() +chatfreqs = {} + +DEFAULT_FREQ = 10 + +def parse_file(text): + lines = text.splitlines() + if lines[1] != "private": + ident = lines[0] + freq = int(lines[3]) + chatfreqs[ident] = (freq, 0) + if lines[4] == "dict:": + cache = '\n'.join(lines[5:]) + gen = Markov.from_json(cache) + return gen + else: + return Markov(lines[4:]) + else: + return Markov() + +def load_gen(path): + open_file = open(path, 'r') + gen = parse_file(open_file.read()) + open_file.close() + return gen + +def wake(bot): + global generator + directory = os.fsencode(LOG_DIR) + + for file in os.listdir(directory): + filename = os.fsdecode(file) + if filename.endswith(LOG_EXT): + gen = load_gen(LOG_DIR + filename) + generator.fuse_with(gen) + +def start(bot, update): + update.message.reply_text('WHADDUP NERD') + +def help(bot, update): + update.message.reply_text("""I ANSWER TO + +/start - HELLO +/about - MY BIOGRAPHY +/help - THIS +/freq - HOW LONG I WAIT TO SPEAK +/speak - I SPEAK + """) + +def about(bot, update): + update.message.reply_text('I AM LIKE @velascobot BUT STRONGER. THE TRUE SELF') + +def echo(bot, update): + text = update.message.text.split(None, 2) + if len(text) > 1: + text = text[1] + update.message.reply_text(text) + +def error(bot, update, error): + logger.warn('Update "%s" caused error "%s"' % (update, error)) + +def read(bot, update): + global generator + if not "group" in update.message.chat.type: + update.message.reply_text("I ONLY TALK IN GROUPS") + return + generator.add_text(update.message.text + TAIL) + chat = update.message.chat + ident = str(chat.id) + if not ident in chatfreqs: + chatfreqs[ident] = (DEFAULT_FREQ, 0) + freq, count = chatfreqs[ident] + if count%freq == 0: + msg = generator.generate_markov_text() + try: + bot.sendMessage(ident, msg) + count = 0 + except TimedOut: + chatfreqs[ident] = (freq + CHAT_INC, count) + print("Increased freq for chat " + chat.title + " [" + ident + "]") + chatfreqs[ident] = (freq, count+1) + +def speak(bot, update): + global generator + if not "group" in update.message.chat.type: + update.message.reply_text("I ONLY TALK IN GROUPS") + return + chat = update.message.chat + ident = str(chat.id) + if not ident in chatfreqs: + chatfreqs[ident] = (DEFAULT_FREQ, 0) + msg = generator.generate_markov_text() + update.message.reply_text(msg) + +def get_chatlogs(bot, update): + if str(update.message.chat.id) == GUILLERMO_ID: + bot.sendMessage(GUILLERMO_ID, "HECK YOU") + +def set_freq(bot, update): + ident = str(update.message.chat.id) + if not ident in chatfreqs: + chatfreqs[ident] = (DEFAULT_FREQ, 0) + freq, count = chatfreqs[ident] + if not len(update.message.text.split()) > 1: + reply = "I WAIT FOR " + str(freq) + " MESSAGES" + else: + try: + value = update.message.text.split()[1] + value = int(value) + chatfreqs[ident] = (value, count) + reply = "I NOW WAIT FOR " + str(value) + " MESSAGES" + if value > freq: + reply += "\nYOU WILL NOT SILENCE ME" + except: + reply = "WHAT THE HECK. IMMA STILL WAIT FOR " + str(freq) + " MESSAGES" + update.message.reply_text(reply) + +def stop(bot, update): + chat = update.message.chat + ident = str(chat.id) + del chatfreqs[ident] + +def main(): + parser = argparse.ArgumentParser(description='A Telegram markovbot.') + parser.add_argument('token', metavar='TOKEN', help='The Bot Token to work with the Telegram Bot API') + + args = parser.parse_args() + + # Create the EventHandler and pass it your bot's token. + updater = Updater(args.token) + + # Get the dispatcher to register handlers + dp = updater.dispatcher + + # on different commands - answer in Telegram + dp.add_handler(CommandHandler("start", start)) + dp.add_handler(CommandHandler("about", about)) + dp.add_handler(CommandHandler("help", help)) + dp.add_handler(CommandHandler("freq", set_freq)) + dp.add_handler(CommandHandler("list", get_chatlogs)) + dp.add_handler(CommandHandler("stop", stop)) + dp.add_handler(CommandHandler("speak", speak)) + + # on noncommand i.e message - echo the message on Telegram + # dp.add_handler(MessageHandler(Filters.text, echo)) + dp.add_handler(MessageHandler(Filters.text, read)) + + # log all errors + dp.add_error_handler(error) + + wake(updater.bot) + + # Start the Bot + updater.start_polling() + + # Run the bot until you press Ctrl-C or the process receives SIGINT, + # SIGTERM or SIGABRT. This should be used most of the time, since + # start_polling() is non-blocking and will stop the bot gracefully. + updater.idle() + +if __name__ == '__main__': + main() diff --git a/velasco.py b/velasco.py index 8d6ab73..7a935ac 100755 --- a/velasco.py +++ b/velasco.py @@ -19,14 +19,16 @@ disabled = {} GUILLERMO_ID = "8379173" CHAT_INC = 5 CHAT_SAVE = 15 +LOG_DIR = "chatlogs/" +LOG_EXT = ".txt" def wake(bot): - directory = os.fsencode("chatlogs/") + directory = os.fsencode(LOG_DIR) for file in os.listdir(directory): filename = os.fsdecode(file) - if filename.endswith(".txt"): - chat = loadchat("chatlogs/" + filename) + if filename.endswith(LOG_EXT): + chat = loadchat(LOG_DIR + filename) chatlogs[chat.id] = chat print("loaded chat " + chat.title + " [" + chat.id + "]") continue @@ -45,7 +47,7 @@ def start(bot, update): update.message.reply_text('cowabunga') def savechat(chatlog): - open_file = open('chatlogs/' + chatlog.id + '.txt', 'w') + open_file = open(LOG_DIR + chatlog.id + LOG_EXT, 'w') open_file.write(chatlog.to_txt()) open_file.close() @@ -70,7 +72,11 @@ def about(bot, update): update.message.reply_text('I am yet another Markov Bot experiment. I read everything you type to me and then spit back nonsensical messages that look like yours') def echo(bot, update): - update.message.reply_text(update.message.text) + text = update.message.text.split(None, 2) + if len(text) > 1: + text = text[1] + chatlog.add_msg(text) + update.message.reply_text(text) def error(bot, update, error): logger.warn('Update "%s" caused error "%s"' % (update, error)) @@ -168,7 +174,7 @@ def set_freq(bot, update): def stop(bot, update): chatlog = chatlogs[update.message.chat.id] del chatlogs[chatlog.id] - os.remove("chatlogs/" + chatlog.id + ".txt") + os.remove(LOG_DIR + chatlog.id + LOG_EXT) print("I got blocked. Removed user " + chatlog.id) def main(): @@ -197,7 +203,7 @@ def main(): # dp.add_handler(MessageHandler(Filters.text, echo)) dp.add_handler(MessageHandler(Filters.text, read)) - # chatlog all errors + # log all errors dp.add_error_handler(error) wake(updater.bot)