anope

- supernets anope source code & configuration
git clone git://git.acid.vegas/anope.git
Log | Files | Refs | Archive | README

m_sql_log.cpp (2578B)

      1 /*
      2  *
      3  * (C) 2003-2022 Anope Team
      4  * Contact us at team@anope.org
      5  *
      6  * Please read COPYING and README for further details.
      7  */
      8 
      9 #include "module.h"
     10 #include "modules/sql.h"
     11 
     12 class SQLLog : public Module
     13 {
     14 	std::set<Anope::string> inited;
     15 	Anope::string table;
     16 
     17  public:
     18 	SQLLog(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR | EXTRA)
     19 	{
     20 	}
     21 
     22 	void OnReload(Configuration::Conf *conf) anope_override
     23 	{
     24 		Configuration::Block *config = conf->GetModule(this);
     25 		this->table = config->Get<const Anope::string>("table", "logs");
     26 	}
     27 
     28 	void OnLogMessage(LogInfo *li, const Log *l, const Anope::string &msg) anope_override
     29 	{
     30 		Anope::string ref_name;
     31 		ServiceReference<SQL::Provider> SQL;
     32 
     33 		for (unsigned i = 0; i < li->targets.size(); ++i)
     34 		{
     35 			const Anope::string &target = li->targets[i];
     36 			size_t sz = target.find("sql_log:");
     37 			if (!sz)
     38 			{
     39 				ref_name = target.substr(8);
     40 				SQL = ServiceReference<SQL::Provider>("SQL::Provider", ref_name);
     41 				break;
     42 			}
     43 		}
     44 
     45 		if (!SQL)
     46 			return;
     47 
     48 		if (!inited.count(ref_name))
     49 		{
     50 			inited.insert(ref_name);
     51 
     52 			SQL::Query create("CREATE TABLE IF NOT EXISTS `" + table + "` ("
     53 						"`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,"
     54 						"`type` varchar(64) NOT NULL,"
     55 						"`user` varchar(64) NOT NULL,"
     56 						"`acc` varchar(64) NOT NULL,"
     57 						"`command` varchar(64) NOT NULL,"
     58 						"`channel` varchar(64) NOT NULL,"
     59 						"`msg` text NOT NULL"
     60 					")");
     61 
     62 			SQL->Run(NULL, create);
     63 		}
     64 
     65 		SQL::Query insert("INSERT INTO `" + table + "` (`type`,`user`,`acc`,`command`,`channel`,`msg`)"
     66 			"VALUES (@type@, @user@, @acc@, @command@, @channel@, @msg@)");
     67 
     68 		switch (l->type)
     69 		{
     70 			case LOG_ADMIN:
     71 				insert.SetValue("type", "ADMIN");
     72 				break;
     73 			case LOG_OVERRIDE:
     74 				insert.SetValue("type", "OVERRIDE");
     75 				break;
     76 			case LOG_COMMAND:
     77 				insert.SetValue("type", "COMMAND");
     78 				break;
     79 			case LOG_SERVER:
     80 				insert.SetValue("type", "SERVER");
     81 				break;
     82 			case LOG_CHANNEL:
     83 				insert.SetValue("type", "CHANNEL");
     84 				break;
     85 			case LOG_USER:
     86 				insert.SetValue("type", "USER");
     87 				break;
     88 			case LOG_MODULE:
     89 				insert.SetValue("type", "MODULE");
     90 				break;
     91 			case LOG_NORMAL:
     92 				insert.SetValue("type", "NORMAL");
     93 				break;
     94 			default:
     95 				return;
     96 		}
     97 
     98 		insert.SetValue("user", l->u ? l->u->nick : "");
     99 		insert.SetValue("acc", l->nc ? l->nc->display : "");
    100 		insert.SetValue("command", l->c ? l->c->name : "");
    101 		insert.SetValue("channel", l->ci ? l->ci->name : "");
    102 		insert.SetValue("msg", msg);
    103 
    104 		SQL->Run(NULL, insert);
    105 	}
    106 };
    107 
    108 MODULE_INIT(SQLLog)