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
|
#include <stdio.h>
#include "users.h"
#include "channels.h"
#include "modules.h"
/* $ModDesc: Povides a proof-of-concept test /WOOT command */
Server *Srv;
void handle_woot(char **parameters, int pcnt, userrec *user)
{
// this test command just accepts:
// /woot :<text>
// and sends <text> to all opers with +s mode.
// NB: The ':' is *REQUIRED* otherwise the parser will
// split the line into multiple parameters[]!
//
// If you want to process all the line with no leading colon, you must
// implement a parser here that assembles parameters[] to match the
// syntax of your command - the way it is done in the core is to meet
// rfc-compatibility.
Srv->SendOpers(parameters[0]);
// 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
{
public:
ModuleTestCommand()
{
Srv = new Server;
// 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.
Srv->AddCommand("WOOT",handle_woot,0,1);
// Add a mode +Z for channels with no parameters
Srv->AddExtendedMode('Z',MT_CHANNEL,false,1,0);
}
virtual bool OnExtendedMode(userrec* user, chanrec* chan, 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;
}
if (mode_on) {
Srv->Log(DEBUG,"Custom mode is being added to channel");
}
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()
{
delete Srv;
}
virtual Version GetVersion()
{
return Version(1,0,0,0);
}
virtual void OnUserConnect(userrec* user)
{
}
};
class ModuleTestCommandFactory : public ModuleFactory
{
public:
ModuleTestCommandFactory()
{
}
~ModuleTestCommandFactory()
{
}
virtual Module * CreateModule()
{
return new ModuleTestCommand;
}
};
extern "C" void * init_module( void )
{
return new ModuleTestCommandFactory;
}
|