#include #include #include #include #include #include #include #include #include #include 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 valid_horoszkopok = {"vizonto","halak","kos","bika","ikrek","rak","oroszlan","szuz","merleg","skorpio","nyilas","bak"}; static const std::vector 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 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(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,"
", "
"); 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,"
", "
"); 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; }