]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/channels.cpp
Added +O mode support through m_operchans.so
[user/henk/code/inspircd.git] / src / channels.cpp
1 #include "inspircd.h"
2 #include "inspircd_io.h"
3 #include "inspircd_util.h"
4 #include "inspircd_config.h"
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <sys/errno.h>
8 #include <sys/ioctl.h>
9 #include <sys/utsname.h>
10 #include <cstdio>
11 #include <time.h>
12 #include <string>
13 #ifdef GCC3
14 #include <ext/hash_map>
15 #else
16 #include <hash_map>
17 #endif
18 #include <map>
19 #include <sstream>
20 #include <vector>
21 #include <errno.h>
22 #include <deque>
23 #include <errno.h>
24 #include <unistd.h>
25 #include <sched.h>
26 #include "connection.h"
27 #include "users.h"
28 #include "servers.h"
29 #include "ctables.h"
30 #include "globals.h"
31 #include "modules.h"
32 #include "dynamic.h"
33 #include "wildcard.h"
34 #include "message.h"
35 #include "mode.h"
36 #include "xline.h"
37
38 #ifdef GCC3
39 #define nspace __gnu_cxx
40 #else
41 #define nspace std
42 #endif
43
44 using namespace std;
45
46 extern int MODCOUNT;
47 extern vector<Module*> modules;
48 extern vector<ircd_module*> factory;
49
50 extern int LogLevel;
51 extern char ServerName[MAXBUF];
52 extern char Network[MAXBUF];
53 extern char ServerDesc[MAXBUF];
54 extern char AdminName[MAXBUF];
55 extern char AdminEmail[MAXBUF];
56 extern char AdminNick[MAXBUF];
57 extern char diepass[MAXBUF];
58 extern char restartpass[MAXBUF];
59 extern char motd[MAXBUF];
60 extern char rules[MAXBUF];
61 extern char list[MAXBUF];
62 extern char PrefixQuit[MAXBUF];
63 extern char DieValue[MAXBUF];
64
65 extern int debugging;
66 extern int WHOWAS_STALE;
67 extern int WHOWAS_MAX;
68 extern int DieDelay;
69 extern time_t startup_time;
70 extern int NetBufferSize;
71 int MaxWhoResults;
72 extern time_t nb_start;
73
74 extern std::vector<int> fd_reap;
75 extern std::vector<std::string> module_names;
76
77 extern char bannerBuffer[MAXBUF];
78 extern int boundPortCount;
79 extern int portCount;
80 extern int UDPportCount;
81 extern int ports[MAXSOCKS];
82 extern int defaultRoute;
83
84 extern std::vector<long> auth_cookies;
85 extern std::stringstream config_f;
86
87 extern serverrec* me[32];
88
89 extern FILE *log_file;
90
91
92 using namespace std;
93
94 std::vector<ModeParameter> custom_mode_params;
95
96 chanrec::chanrec()
97 {
98         strcpy(name,"");
99         strcpy(custom_modes,"");
100         strcpy(topic,"");
101         strcpy(setby,"");
102         strcpy(key,"");
103         created = topicset = limit = 0;
104         topiclock = noexternal = inviteonly = moderated = secret = c_private = false;
105 }
106
107 void chanrec::SetCustomMode(char mode,bool mode_on)
108 {
109         if (mode_on) {
110                 char m[3];
111                 m[0] = mode;
112                 m[1] = '\0';
113                 if (!strchr(this->custom_modes,mode))
114                 {
115                         strncat(custom_modes,m,MAXMODES);
116                 }
117                 log(DEBUG,"Custom mode %c set",mode);
118         }
119         else {
120                 char temp[MAXBUF];
121                 int count = 0;
122                 for (int q = 0; q < strlen(custom_modes); q++) {
123                         if (custom_modes[q] != mode) {
124                                 temp[count++] = mode;
125                         }
126                 }
127                 temp[count] = '\0';
128                 strncpy(custom_modes,temp,MAXMODES);
129                 log(DEBUG,"Custom mode %c removed",mode);
130                 this->SetCustomModeParam(mode,"",false);
131         }
132 }
133
134
135 void chanrec::SetCustomModeParam(char mode,char* parameter,bool mode_on)
136 {
137
138         log(DEBUG,"SetCustomModeParam called");
139         ModeParameter M;
140         M.mode = mode;
141         strcpy(M.channel,this->name);
142         strcpy(M.parameter,parameter);
143         if (mode_on)
144         {
145                 log(DEBUG,"Custom mode parameter %c %s added",mode,parameter);
146                 custom_mode_params.push_back(M);
147         }
148         else
149         {
150                 if (custom_mode_params.size())
151                 {
152                         for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
153                         {
154                                 if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
155                                 {
156                                         log(DEBUG,"Custom mode parameter %c %s removed",mode,parameter);
157                                         custom_mode_params.erase(i);
158                                         return;
159                                 }
160                         }
161                 }
162                 log(DEBUG,"*** BUG *** Attempt to remove non-existent mode parameter!");
163         }
164 }
165
166 bool chanrec::IsCustomModeSet(char mode)
167 {
168         log(DEBUG,"Checking ISCustomModeSet: %c %s",mode,this->custom_modes);
169         return (strchr(this->custom_modes,mode) != 0);
170 }
171
172 std::string chanrec::GetModeParameter(char mode)
173 {
174         if (custom_mode_params.size())
175         {
176                 for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
177                 {
178                         if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
179                         {
180                                 return std::string(i->parameter);
181                         }
182                 }
183         }
184         return std::string("");
185 }