136 lines
5.7 KiB
C++
136 lines
5.7 KiB
C++
#include <iostream>
|
|
#include <string>
|
|
#include <cstring>
|
|
#include <ctime>
|
|
#include <set>
|
|
#include <vector>
|
|
#include <curl/curl.h>
|
|
#include <json/json.h>
|
|
#include <matrix/Client.h>
|
|
#include <regex>
|
|
|
|
static const char* honapok[] = {"januar","februar","marcius","aprilis","majus","junius","julius","augusztus","szeptember","oktober","november","december"};
|
|
|
|
static const char* ekezetek[] = {"á","é","í","ó","ö","ő","ú","ü","ű"};
|
|
static const char* ekezet_mentes[] = {"a","e","i","o","o","o","u","u","u"};
|
|
static const size_t arr_len = 9;
|
|
|
|
static const std::set<std::string> valid_horoszkopok = {"vizonto","halak","kos","bika","ikrek","rak","oroszlan","szuz","merleg","skorpio","nyilas","bak"};
|
|
static const std::vector<std::string> error_messages = {"Bizonyára megtréfált az univerzum!","Ne haragudj,de az univerzum ilyen csúnya szavakra nem reagál!","Bocsáss meg az univerzum most nem szeretné hogy segítsek!","Bocsáss meg lemerült az univerzum. Most nem tud segíteni.","Amint feltöltődik az univerzum segítek!","Az univerzum nem akar jósolni neked!Gondolom bűnös lélek vagy!","Ilyen csúnya szavakra nem vagyok hajlandó reagálni!", "Nem kaptam tőled pénzt,így az univerzum nem tud segíteni neked!","Az univerzum elutasított téged.7 éven belül balszerencse fog érni.","Az univerzum megsértődött magára.","Az univerzum nem szereti az ilyen fajta gúnyolódást.","Takarodjon innen!!Ne becsmérelje az univerzumot!!"};
|
|
static const std::vector<std::string> message_prefix = {"Az univerzum azt üzeni, hogy","Szétterítem a kártyáimat! Látom hogy","Kiterítem a kártyáimat! Látom hogy"};
|
|
|
|
size_t writefunc(void *ptr, size_t size, size_t nmemb, std::string *s)
|
|
{
|
|
s->append(static_cast<char *>(ptr), size*nmemb);
|
|
return size*nmemb;
|
|
}
|
|
|
|
|
|
struct Magdi : public Matrix::EventListener {
|
|
Matrix::Logger logger;
|
|
//! Get string from the web
|
|
std::string get(std::string URL){
|
|
CURL *curl;
|
|
CURLcode res;
|
|
curl = curl_easy_init();
|
|
if(curl) {
|
|
std::string s;
|
|
curl_easy_setopt(curl, CURLOPT_URL, URL.c_str());
|
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
|
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
|
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
|
|
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
|
|
|
|
res = curl_easy_perform(curl);
|
|
if(res != CURLE_OK)
|
|
fprintf(stderr, "curl_easy_perform() failed: %s\n",
|
|
curl_easy_strerror(res));
|
|
curl_easy_cleanup(curl);
|
|
return s;
|
|
}
|
|
return "";
|
|
}
|
|
std::string getStringBetween(const std::string& text,const char* start,const char* end){
|
|
int ini = text.find(start);
|
|
if(ini == std::string::npos)
|
|
return "";
|
|
ini += std::strlen(start);
|
|
int len = text.find(end,ini) - ini;
|
|
return text.substr(ini,len);
|
|
}
|
|
|
|
std::string& replaceAllEkezet(std::string& text){
|
|
for(int i = 0;i < arr_len;++i) {
|
|
text = std::regex_replace(text,std::regex(ekezetek[i]),ekezet_mentes[i]);
|
|
}
|
|
return text;
|
|
}
|
|
|
|
bool isValid(const std::string& horoszkop) const{
|
|
return valid_horoszkopok.find(horoszkop) != valid_horoszkopok.end();
|
|
}
|
|
|
|
std::string getURL(const std::string& type, std::string& horoszkop) {
|
|
time_t t = time(0); // get time now
|
|
struct tm * now = localtime(&t);
|
|
int zeros = (now->tm_mday >= 10) ? 0 : 1;
|
|
return "https://www.astronet.hu/horoszkop/"+ replaceAllEkezet(horoszkop) +"-"+type+"-horoszkop/" + std::to_string(now->tm_year+1900) +"-"+ honapok[now->tm_mon] +"-"+std::string(zeros,'0').append(std::to_string(now->tm_mday))+"/";
|
|
}
|
|
|
|
void handleCommand(const std::string& type, const Matrix::Event& event) {
|
|
std::string message;
|
|
client->setTyping(event.getRoomId(),true,5000);
|
|
std::string horoszkop = event.getContent()["body"].asString();
|
|
horoszkop.replace(horoszkop.begin(),horoszkop.begin() + 6,"");
|
|
horoszkop = replaceAllEkezet(horoszkop);
|
|
if(!isValid(horoszkop)){
|
|
message = error_messages[rand() % error_messages.size()];
|
|
}else {
|
|
std::string URL = getURL(type,horoszkop);
|
|
std::string response = get(URL);
|
|
response = getStringBetween(response,"<div class=\"details-content\">", "</div>");
|
|
response[0] = tolower(response[0]);
|
|
message = (response != "") ? message_prefix[rand() % message_prefix.size()]+" "+ response : error_messages[rand() % error_messages.size()];
|
|
}
|
|
Json::Value msg_content;
|
|
msg_content["msgtype"] = "m.type";
|
|
msg_content["body"] = message ; //getStringBetween(response,"<div class=\"details-content\">", "</div>");
|
|
client->send(event.getRoomId(),"m.room.message",msg_content);
|
|
}
|
|
|
|
//! Basic constructor
|
|
Magdi(Matrix::Client*c): Matrix::EventListener(c) {
|
|
srand(time(0));
|
|
setlocale(LC_ALL, "hu_HU.utf8");
|
|
}
|
|
//! EventListener override
|
|
virtual void onEvent(const Matrix::Event& event) {
|
|
//On message
|
|
if(event.getType() == "m.room.message"){
|
|
//Check if prefix matches
|
|
if(event.getContent()["body"].asString().rfind("!napi ",0) == 0){
|
|
handleCommand("napi", event);
|
|
}else if(event.getContent()["body"].asString().rfind("!heti ",0) == 0){
|
|
handleCommand("heti", event);
|
|
}else if(event.getContent()["body"].asString().rfind("!havi ",0) == 0){
|
|
handleCommand("havi", event);
|
|
}
|
|
}else if(event.getType() == "m.room.member" && event.getContent()["membership"].isString() && event.getContent()["membership"].asString() == "join"){
|
|
client->joinRoom(event.getRoomId());
|
|
}
|
|
}
|
|
};
|
|
|
|
int main(){
|
|
Matrix::Logger logger;
|
|
Matrix::Homeserver server(getenv("HOMESERVER_NAME"),getenv("HOMESERVER_URL"));
|
|
Matrix::Client c(&server, getenv("ACCESS_TOKEN"));
|
|
logger.info("Logged in as " + c.getDisplayName());
|
|
c.setDisplayName("Magdi Jósnő");
|
|
Matrix::EventListener* listener = new Magdi(&c);
|
|
c.addEventListener(listener);
|
|
c.start();
|
|
delete listener;
|
|
return 0;
|
|
}
|