Init magdi

This commit is contained in:
Balazs Toldi 2021-02-01 16:17:06 +01:00
parent 903d0fbb3a
commit a411c72185
Signed by: Bazsalanszky
GPG key ID: 933820884952BE27
2 changed files with 112 additions and 14 deletions

View file

@ -1,13 +1,16 @@
cmake_minimum_required(VERSION 3.17)
project(matrix_cpp_examplebot)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD 20)
add_executable(matrix_cpp_examplebot main.cpp)
add_subdirectory(external/matrix-cpp-sdk)
target_link_libraries(matrix_cpp_examplebot matrix-cpp-sdk)
target_include_directories(matrix_cpp_examplebot PRIVATE external/matrix-cpp-sdk/src)
target_link_libraries(matrix_cpp_examplebot jsoncpp_lib)
target_link_libraries(matrix_cpp_examplebot
PRIVATE jsoncpp_lib
PRIVATE libcurl
PRIVATE matrix-cpp-sdk
)
include_directories(${Jsoncpp_INCLUDE_DIR})
include_directories(${MATRIX_CPP_INCLUDE_DIR})
include_directories(${MATRIX_CPP_INCLUDE_DIR})

115
main.cpp
View file

@ -1,15 +1,110 @@
#include <iostream>
#include <matrix/Client.h>
#include <string>
#include <cstring>
#include <ctime>
#include <set>
#include <vector>
#include <curl/curl.h>
#include <json/json.h>
#include <matrix/Client.h>
#include <regex>
struct BasicEventListener : public Matrix::EventListener{
BasicEventListener(Matrix::Client*c): Matrix::EventListener(c) {}
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(std::string horoszkop){
return valid_horoszkopok.find(horoszkop) != valid_horoszkopok.end();
}
//! 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) {
if(event.getType() == "m.room.message" && event.getContent()["body"].asString() == "!ping"){
Json::Value msg_content;
msg_content["msgtype"] = "m.type";
msg_content["body"] = "pong!";
client->send(event.getRoomId(),"m.room.message",msg_content);
//On message
if(event.getType() == "m.room.message"){
//Check if prefix matches
if(event.getContent()["body"].asString().starts_with("!napi ")){
std::string message;
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 {
time_t t = time(0); // get time now
struct tm * now = localtime(&t);
int zeros = (now->tm_mday > 10) ? 0 : 1;
std::string URL = "https://www.astronet.hu/horoszkop/"+ replaceAllEkezet(horoszkop) +"-napi-horoszkop/" + std::to_string(now->tm_year+1900) +"-"+ honapok[now->tm_mon] +"-"+std::string(zeros,'0').append(std::to_string(now->tm_mday))+"/";
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);
}
}
}
};
@ -18,8 +113,8 @@ int main(){
Matrix::Logger logger;
Matrix::Homeserver server(getenv("HOMESERVER_NAME"),getenv("HOMESERVER_URL"));
Matrix::Client c(&server, getenv("ACCESS_TOKEN"));
Matrix::EventListener* listener = new BasicEventListener(&c);
c.setDisplayName("Magdi Jósnő");
Matrix::EventListener* listener = new Magdi(&c);
c.addEventListener(listener);
c.start_thread();
delete listener;