Added a simple example bot
This commit is contained in:
parent
fd7d03cd01
commit
18101809d8
201
examples/example01.cc
Normal file
201
examples/example01.cc
Normal file
@ -0,0 +1,201 @@
|
||||
/**
|
||||
*
|
||||
* This is a simple bot that can echo a message, piped to its
|
||||
* binary and is usable as a cgi script to react on some
|
||||
* simple commands.
|
||||
*
|
||||
* Before you first use this example, change WEBHOOK_URL and
|
||||
* BOT_TOKEN according to your needs and your web server!
|
||||
*
|
||||
* Example:
|
||||
* WEBHOK_URL: https://bot.foobar.tld/cgi-bin/bot.cgi
|
||||
* BOT_TOKEN: Your token given by Telegram's Bot Father!
|
||||
*
|
||||
* To compile do:
|
||||
* g++ -c -o example01.o -I/usr/include/jsoncpp example01.cc
|
||||
* g++ -o example01 example01.o -ltgbotpp
|
||||
*
|
||||
* Run:
|
||||
* echo "Your message" | ./example01 -u <your user id>
|
||||
*/
|
||||
|
||||
#include <Telegram/TelegramBot.h>
|
||||
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <termios.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define WEBHOOK_URL "https://<your-web-server>/cgi-bin/<binary name>"
|
||||
#define BOT_TOKEN "<your token>"
|
||||
#define SSTR( x ) static_cast< std::ostringstream & >(( std::ostringstream() << std::dec << x ) ).str()
|
||||
|
||||
std::string exec(const char* cmd) {
|
||||
|
||||
FILE* pipe = popen(cmd, "r");
|
||||
if (!pipe)
|
||||
return "ERROR";
|
||||
|
||||
char buffer[128];
|
||||
std::string result = "";
|
||||
while (!feof(pipe)) {
|
||||
if (fgets(buffer, 128, pipe) != NULL)
|
||||
result += buffer;
|
||||
}
|
||||
pclose(pipe);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<std::string> explode( const std::string &delimiter, const std::string &str) {
|
||||
|
||||
std::vector<std::string> arr;
|
||||
|
||||
int strleng = str.length();
|
||||
int delleng = delimiter.length();
|
||||
if (delleng == 0)
|
||||
return arr; //no change
|
||||
|
||||
int i = 0;
|
||||
int k = 0;
|
||||
while(i < strleng) {
|
||||
int j = 0;
|
||||
while ((i+j < strleng) && (j < delleng) && (str[i+j] == delimiter[j]))
|
||||
j++;
|
||||
if (j == delleng) {
|
||||
arr.push_back(str.substr(k, i-k));
|
||||
i += delleng;
|
||||
k = i;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
arr.push_back(str.substr(k, i-k));
|
||||
return arr;
|
||||
}
|
||||
|
||||
// Command methods (callbacks)
|
||||
std::string start(Telegram::TelegramBot *tg, Telegram::TCommandLine args) {
|
||||
|
||||
return("I am a simple Bot, written in C++\nHave fun.");
|
||||
}
|
||||
|
||||
std::string help(Telegram::TelegramBot *tg, Telegram::TCommandLine args) {
|
||||
|
||||
std::map<std::string, Telegram::TCommand>::iterator it;
|
||||
std::string help_list = "Commands:\n";
|
||||
Telegram::TCommandMap command_map = tg->getCommandMap();
|
||||
|
||||
for (it = command_map.begin(); it != command_map.end(); it++) {
|
||||
help_list = help_list + it->first + ": " + it->second.help_text + "\n";
|
||||
}
|
||||
|
||||
return(help_list);
|
||||
}
|
||||
|
||||
std::string whoami(Telegram::TelegramBot *tg, Telegram::TCommandLine args) {
|
||||
|
||||
return("Your ID is " + SSTR(tg->getMessage()->getChat()->getId()));
|
||||
}
|
||||
|
||||
std::string loadavg(Telegram::TelegramBot *tg, Telegram::TCommandLine args) {
|
||||
|
||||
return(exec("cat /proc/loadavg"));
|
||||
}
|
||||
|
||||
std::string proc(Telegram::TelegramBot *tg, Telegram::TCommandLine args) {
|
||||
|
||||
return(exec("pstree"));
|
||||
}
|
||||
|
||||
// main function
|
||||
int main(int argc, char** argv) {
|
||||
std::vector<std::string> sExploded = explode(".", argv[0]);
|
||||
|
||||
// @TODO: Check if we are called as .cgi!
|
||||
if ((sExploded.size() > 1) && (sExploded[1] == "cgi")) {
|
||||
// Do bot stuff!
|
||||
std::string line = "";
|
||||
while(std::cin) {
|
||||
std::string s;
|
||||
std::getline(std::cin, s);
|
||||
line = line + s;
|
||||
}
|
||||
Telegram::TelegramBot tg(BOT_TOKEN);
|
||||
|
||||
// Set the commands
|
||||
Telegram::TCommand sc;
|
||||
sc.command = "/start";
|
||||
sc.callback = &start;
|
||||
sc.help_text = "This is the start command";
|
||||
tg.addCommand(sc);
|
||||
|
||||
sc.command = "/help";
|
||||
sc.callback = &help;
|
||||
sc.help_text = "Shows you the commands this bot knows";
|
||||
tg.addCommand(sc);
|
||||
|
||||
sc.command = "/whoami";
|
||||
sc.callback = &whoami;
|
||||
sc.help_text = "Tells you your Telegram ID";
|
||||
tg.addCommand(sc);
|
||||
|
||||
sc.command = "/loadavg";
|
||||
sc.callback = &loadavg;
|
||||
sc.help_text = "Shows average load of the system this bot is running on";
|
||||
tg.addCommand(sc);
|
||||
|
||||
sc.command = "/proc";
|
||||
sc.callback = &proc;
|
||||
sc.help_text = "Shows the process list of the system the bot is running on";
|
||||
tg.addCommand(sc);
|
||||
|
||||
tg.processMessage(line);
|
||||
|
||||
} else {
|
||||
// Process options
|
||||
std::string user_id = ""; // ID of the receiving user
|
||||
|
||||
char c;
|
||||
while ((c = getopt(argc, argv, "u:")) != -1) {
|
||||
switch(c) {
|
||||
case 'u':
|
||||
user_id = (std::string)optarg;
|
||||
break;
|
||||
case ':':
|
||||
std::cerr << optopt << " without argument" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (user_id == "") {
|
||||
std::cerr << "No user ID given!" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Read from stdin
|
||||
struct termios t;
|
||||
std::string s = "";
|
||||
if (tcgetattr(STDIN_FILENO, &t) < 0) {
|
||||
// If we have a text piped in, read from std::cin
|
||||
while(std::cin) {
|
||||
std::string line;
|
||||
std::getline(std::cin, line);
|
||||
s = s + line + "\n";
|
||||
}
|
||||
s.erase(s.end()-1);
|
||||
}
|
||||
|
||||
if (s != "") {
|
||||
Telegram::TelegramBot tg(BOT_TOKEN);
|
||||
tg.sendMessage(s, user_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user