#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "TSession.h" extern list plugins; TSession::TSession(string nickname, TConnection* parent_) { nick=nickname; cout << "new session: "<< nick<::iterator it=plugins.begin(); it!=plugins.end(); it++) { TPluginParent::hiddenaddplugincontext((*it)->get_default_flags_for_sessions(), (*it)->get_context_size()); if ((contexts.rbegin())->flags & PFLAGS_EXEC_ONCREATE) (*it)->execute( &(*(contexts.rbegin())) , curr_msg, this, PFLAGS_EXEC_ONCREATE); } } TSession::~TSession() { cout << "session for "<::iterator it2=plugins.begin(); ircmessage curr_msg=static_cast(parent)->get_curr_msg(); for (list::iterator it=contexts.begin(); it!=contexts.end(); it++) { if (it->flags & PFLAGS_EXEC_ONDESTROY) (*it2)->execute( &(*it) , curr_msg, this, PFLAGS_EXEC_ONDESTROY); it2++; } } void TSession::interpret_message(ircmessage msg) { if (ucase(msg.command)=="PRIVMSG") //wir kriegen eine nachricht? if (ucase(msg.params)==ucase(parent->get_nick())) //keine channelnachricht? if (ucase(msg.origin_raw)==ucase(nick)) //vom besitzer dieser session? msg_for_us=true; //dann ist sie für uns! if (ucase(msg.command)=="NOTICE") //wir kriegen eine notice? if (ucase(msg.params)==ucase(parent->get_nick())) //keine channelnachricht? if (ucase(msg.origin_raw)==ucase(nick)) //vom besitzer dieser session? msg_for_us=true; //dann ist sie für uns! if (ucase(msg.command)=="NICK") //jemand benennt sich einfach so um? if (ucase(msg.origin_raw)==ucase(nick)) //der besitzer dieser session benennt sich um? { nick=msg.content+"!"+get_hostmask(msg.origin_raw); msg_for_us=true; //das ist einer erwähnung würdig, oder? } if (msg_for_us) lastevent=time(NULL); } void TSession::exec_plugins(list plugins) { int reason; ircmessage curr_msg=static_cast(parent)->get_curr_msg(); list::iterator it2=plugins.begin(); for (list::iterator it=contexts.begin(); it!=contexts.end(); it++) { reason=0; if (((it->flags) & PFLAGS_EXEC_ONDEMAND) && (curr_msg) && (msg_for_us) )//ist ondemand an und ham wir ne nachricht bekommen? if (ucase(curr_msg.command)=="PRIVMSG") //wars eine privmsg? if (curr_msg.content[0]==static_cast(parent)->comchar) //ist sie ein aufruf? if (match(curr_msg.content.substr(1),(*it2)->get_name())) //ist sie an uns gerichtet? //TODO: wenn cmd geändert wird, z.B. dass , foo statt !foo auch geht, ändern!!! reason|=PFLAGS_EXEC_ONDEMAND; if (((it->flags) & PFLAGS_EXEC_ONEVENT) && (curr_msg) && (msg_for_us) ) reason|=PFLAGS_EXEC_ONEVENT; if (((it->flags) & PFLAGS_EXEC_ONANYEVENT) && (curr_msg) ) reason|=PFLAGS_EXEC_ONANYEVENT; if ((it->flags) & PFLAGS_EXEC_ALWAYS) reason|=PFLAGS_EXEC_ALWAYS; if (reason) (*it2)->execute( &(*it) , curr_msg, this, reason); it2++; } } bool TSession::valid(){ return (time(NULL)-lastevent < 10); //600); //timeout } string TSession::get_name() { cout << "sessGETNAME" << nick << endl; return nick; } void TSession::addplugincontext(TPlugin* plugin){TPluginParent::hiddenaddplugincontext(plugin->get_default_flags_for_sessions(), plugin->get_context_size());} int TSession::get_type() {return TYPE_SESS;} void TSession::say (string what) { parent->send("PRIVMSG "+cut_nick(get_name())+" :"+what); }