/* $ModDesc: Gives /cban, aka C:lines. Think Q:lines, for channels. */
-Server *Srv;
+extern time_t TIME;
+
+class CBan
+{
+ private:
+ unsigned long expiry;
+ std::string chname;
+ std::string reason;
+
+ public:
+ CBan(std::string cn, std::string rs, unsigned long ex)
+ {
+ chname = cn;
+ reason = rs;
+ expiry = ex;
+ }
+
+ std::string GetName()
+ {
+ return this->chname;
+ }
+
+ std::string GetReason()
+ {
+ return this->reason;
+ }
+
+ unsigned long GetExpiry()
+ {
+ return this->expiry;
+ }
+};
+
+/* cbans is declared here, as our type is right above. Don't try move it. */
+vector<CBan> cbans;
class cmd_cban : public command_t
{
- public:
- cmd_cban () : command_t("CBAN",'o',2)
+ private:
+ Server *Srv;
+
+ public:
+ cmd_cban (Server* Me) : command_t("CBAN", 'o', 1)
{
this->source = "m_cban.so";
+ this->Srv = Me;
}
void Handle(char **parameters, int pcnt, userrec *user)
{
- /* Handle CBAN here. */
+ /* syntax: CBAN #channel time :reason goes here */
+ /* 'time' is a human-readable timestring, like 2d3h2s. */
+
+ std::string chname;
+ std::string reason;
+ unsigned long expiry;
+
+ if (pcnt == 1)
+ {
+ /* form: CBAN #channel removes a CBAN */
+ for (vector<CBan>::iterator myiter; myiter < cbans.end(); myiter++)
+ {
+ if (parameters[0] == (*myiter).GetName())
+ {
+ cbans.erase(myiter);
+ break;
+ }
+ }
+ }
+ else if (pcnt >= 2)
+ {
+ /* full form to add a CBAN */
+ /* XXX - checking on chnames */
+ chname = parameters[0];
+ expiry = TIME + Srv->CalcDuration(parameters[1]);
+ reason = parameters[2];
+
+ CBan meow(chname, reason, expiry);
+ cbans.push_back(meow);
+ }
}
};
class ModuleCBan : public Module
{
cmd_cban* mycommand;
- public:
- ModuleCBan(Server* Me) : Module::Module(Me)
- {
- Srv = Me;
- mycommand = new cmd_cban();
- Srv->AddCommand(mycommand);
- }
+ Server* Srv;
- virtual int OnUserPreJoin (userrec *user, chanrec *chan, const char *cname)
+ public:
+ ModuleCBan(Server* Me) : Module::Module(Me)
+ {
+ Srv = Me;
+ mycommand = new cmd_cban(Srv);
+ Srv->AddCommand(mycommand);
+ }
+
+ virtual int OnUserPreJoin(userrec *user, chanrec *chan, const char *cname)
{
/* check cbans in here, and apply as necessary. */
+ log(DEBUG,"In OnUserPreJoin cbans.size() == %d",cbans.size());
+
+ std::string chname = cname;
+
+ for (unsigned int a = 0; a < cbans.size(); a++)
+ {
+ log(DEBUG,"m_cban: DEBUG: checking %s against %s in OnPreUserJoin()", chname.c_str(), cbans[a].GetName().c_str());
+ if (chname == cbans[a].GetName())
+ {
+ /* matches CBAN */
+ WriteOpers("DENY join");
+ return 1;
+ }
+ }
+
+ log(DEBUG,"DONE checking, allowed");
/* Allow the change. */
return 0;