]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/channels.cpp
1def64fd8bcfa1ee656b682e12c7041324c2de9e
[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 int boundPortCount;
78 extern int portCount;
79 extern int UDPportCount;
80 extern int ports[MAXSOCKS];
81 extern int defaultRoute;
82
83 extern std::vector<long> auth_cookies;
84 extern std::stringstream config_f;
85
86 extern serverrec* me[32];
87
88 extern FILE *log_file;
89
90
91 using namespace std;
92
93 std::vector<ModeParameter> custom_mode_params;
94
95 chanrec::chanrec()
96 {
97         strcpy(name,"");
98         strcpy(custom_modes,"");
99         strcpy(topic,"");
100         strcpy(setby,"");
101         strcpy(key,"");
102         created = topicset = limit = 0;
103         topiclock = noexternal = inviteonly = moderated = secret = c_private = false;
104 }
105
106 void chanrec::SetCustomMode(char mode,bool mode_on)
107 {
108         if (mode_on) {
109                 char m[3];
110                 m[0] = mode;
111                 m[1] = '\0';
112                 if (!strchr(this->custom_modes,mode))
113                 {
114                         strncat(custom_modes,m,MAXMODES);
115                 }
116                 log(DEBUG,"Custom mode %c set",mode);
117         }
118         else {
119                 char temp[MAXBUF];
120                 int count = 0;
121                 for (int q = 0; q < strlen(custom_modes); q++) {
122                         if (custom_modes[q] != mode) {
123                                 temp[count++] = mode;
124                         }
125                 }
126                 temp[count] = '\0';
127                 strncpy(custom_modes,temp,MAXMODES);
128                 log(DEBUG,"Custom mode %c removed",mode);
129                 this->SetCustomModeParam(mode,"",false);
130         }
131 }
132
133
134 void chanrec::SetCustomModeParam(char mode,char* parameter,bool mode_on)
135 {
136
137         log(DEBUG,"SetCustomModeParam called");
138         ModeParameter M;
139         M.mode = mode;
140         strcpy(M.channel,this->name);
141         strcpy(M.parameter,parameter);
142         if (mode_on)
143         {
144                 log(DEBUG,"Custom mode parameter %c %s added",mode,parameter);
145                 custom_mode_params.push_back(M);
146         }
147         else
148         {
149                 if (custom_mode_params.size())
150                 {
151                         for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
152                         {
153                                 if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
154                                 {
155                                         log(DEBUG,"Custom mode parameter %c %s removed",mode,parameter);
156                                         custom_mode_params.erase(i);
157                                         return;
158                                 }
159                         }
160                 }
161                 log(DEBUG,"*** BUG *** Attempt to remove non-existent mode parameter!");
162         }
163 }
164
165 bool chanrec::IsCustomModeSet(char mode)
166 {
167         log(DEBUG,"Checking ISCustomModeSet: %c %s",mode,this->custom_modes);
168         return (strchr(this->custom_modes,mode) != 0);
169 }
170
171 std::string chanrec::GetModeParameter(char mode)
172 {
173         if (custom_mode_params.size())
174         {
175                 for (vector<ModeParameter>::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++)
176                 {
177                         if ((i->mode == mode) && (!strcasecmp(this->name,i->channel)))
178                         {
179                                 return std::string(i->parameter);
180                         }
181                 }
182         }
183         return std::string("");
184 }