1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
/* +------------------------------------+
* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
* Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
* E-mail:
* <brain@chatspike.net>
* <Craig@chatspike.net>
*
* Written by Craig Edwards, Craig McLure, and others.
* This program is free but copyrighted software; see
* the file COPYING for details.
*
* ---------------------------------------------------
*/
using namespace std;
#include <stdio.h>
#include "users.h"
#include "channels.h"
#include "modules.h"
/* $ModDesc: Povides a proof-of-concept test /WOOT command */
Server *Srv;
class cmd_woot : public command_t
{
public:
cmd_woot () : command_t("WOOT", 0, 0)
{
this->source = "m_testcommand.so";
}
void Handle (char **parameters, int pcnt, userrec *user)
{
Srv->Log(DEBUG,"woot handler");
// Here is a sample of how to send servermodes. Note that unless remote
// servers in your net are u:lined, they may reverse this, but its a
// quick and effective modehack.
// NOTE: DO NOT CODE LIKE THIS!!! This has no checks and can send
// invalid or plain confusing mode changes, code some checking!
char* modes[3];
modes[0] = "#chatspike";
modes[1] = "+o";
modes[2] = user->nick;
// run the mode change, send numerics (such as "no such channel") back
// to "user".
Srv->SendMode(modes,3,user);
}
};
class ModuleTestCommand : public Module
{
cmd_woot* newcommand;
public:
ModuleTestCommand(Server* Me)
: Module::Module(Me)
{
Srv = Me;
// Create a new command:
// command will be called /WOOT, and will
// call handle_woot when triggered, the
// 0 in the modes parameter signifies that
// anyone can issue the command, and the
// command takes only one parameter.
newcommand = new cmd_woot();
Srv->AddCommand(newcommand);
// Add a mode +Z for channels with no parameters
Srv->AddExtendedMode('Z',MT_CHANNEL,false,1,0);
}
void Implements(char* List)
{
List[I_OnExtendedMode] = List[I_OnUserJoin] = 1;
}
virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list ¶ms)
{
if ((modechar != 'Z') || (type != MT_CHANNEL))
{
// this mode isn't ours, we have to bail and return 0 to not handle it.
Srv->Log(DEBUG,"Extended mode event triggered, but this is not a mode i've claimed!");
return 0;
}
chanrec* chan = (chanrec*)target;
if (mode_on)
{
Srv->Log(DEBUG,"Custom mode is being added to channel");
Srv->Log(DEBUG,chan->name);
}
else
{
Srv->Log(DEBUG,"Custom mode is being taken from a channel");
Srv->Log(DEBUG,chan->name);
}
// must return 1 to handle the mode!
return 1;
}
virtual void OnUserJoin(userrec* user, chanrec* channel)
{
Srv->Log(DEBUG,"OnUserJoin triggered");
if (channel->IsCustomModeSet('Z'))
{
std::string param = channel->GetModeParameter('Z');
Srv->Log(DEBUG,"Custom mode is set on this channel! Parameter="+param);
}
}
virtual ~ModuleTestCommand()
{
}
virtual Version GetVersion()
{
return Version(1,0,0,0,VF_STATIC|VF_VENDOR);
}
};
class ModuleTestCommandFactory : public ModuleFactory
{
public:
ModuleTestCommandFactory()
{
}
~ModuleTestCommandFactory()
{
}
virtual Module * CreateModule(Server* Me)
{
return new ModuleTestCommand(Me);
}
};
extern "C" void * init_module( void )
{
return new ModuleTestCommandFactory;
}
|