You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.1 KiB

#ifndef BOT_H
#define BOT_H
#include <boost/algorithm/string.hpp>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <regex>
#include <string>
#include <vector>
#include <libtelegram/libtelegram.h>
class MarkovDB {
public:
virtual bool add_ngrams(std::vector<std::string> words) = 0;
virtual std::string get_continuation(std::vector<std::string> prompt, int &score) = 0;
virtual ~MarkovDB() {}
virtual bool batch_add_ngrams(std::vector<std::vector<std::string>> batch) = 0;
};
class MarkovChain {
protected:
MarkovDB &markov;
int order = 1;
bool MAKE_LOWER = false;
bool process_string(std::string& message);
std::vector<std::string> split_string(std::string message);
bool test();
public:
bool add_ngrams(std::string message);
std::string continue_message(std::string message, int &score);
MarkovChain (int ord, bool lower, MarkovDB &db)
: markov(db), MAKE_LOWER(lower), order(ord) {;
};
int import_from_file(std::string filename);
std::vector<std::vector<std::string>> get_words(std::string message);
virtual ~MarkovChain() {};
};
class Bot {
protected:
MarkovChain markov;
int replies = 200;
int SCORE_THRESHOLD = 100;
public:
virtual void run() = 0;
Bot(int replies, int score_threshold, MarkovChain m)
: markov(m), replies(replies), SCORE_THRESHOLD(score_threshold) {};
~Bot() {};
};
class TelegramBotM: public Bot {
protected:
std::string api_key = "";
telegram::sender sender;
telegram::listener::poll listener;
std::string chain_name = "markov";
std::string get_token();
void add_echo();
public:
TelegramBotM(int order, MarkovChain &m, std::string chain_name) :
api_key(get_token()), sender(get_token()), listener(sender),
chain_name(chain_name), Bot(200, 100, m) {
add_echo();
};
void run() override {
listener.run();
}
~TelegramBotM() {};
};
#endif