chan.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. /*
  2. * chan.h
  3. * stuff common to chan.c and mode.c
  4. * users.h needs to be loaded too
  5. *
  6. */
  7. #ifndef _EGG_CHAN_H
  8. #define _EGG_CHAN_H
  9. typedef struct memstruct {
  10. struct memstruct *next;
  11. struct userrec *user;
  12. time_t joined;
  13. time_t split; /* in case they were just netsplit */
  14. time_t last; /* for measuring idle time */
  15. time_t delay; /* for delayed autoop */
  16. int hops;
  17. int tried_getuser;
  18. unsigned short flags;
  19. char nick[NICKLEN];
  20. char userhost[UHOSTLEN];
  21. char userip[UHOSTLEN];
  22. } memberlist;
  23. #define CHANMETA "#&!+"
  24. #define NICKVALID "[{}]^`|\\_-"
  25. #define CHANOP BIT0 /* channel +o */
  26. #define CHANVOICE BIT1 /* channel +v */
  27. #define FAKEOP BIT2 /* op'd by server */
  28. #define SENTOP BIT3 /* a mode +o was already sent out for this user */
  29. #define SENTDEOP BIT4 /* a mode -o was already sent out for this user */
  30. #define SENTKICK BIT5 /* a kick was already sent out for this user */
  31. #define SENTVOICE BIT6 /* a mode +v was already sent out for this user */
  32. #define SENTDEVOICE BIT7 /* a devoice has been sent */
  33. #define WASOP BIT8 /* was an op before a split */
  34. #define STOPWHO BIT9
  35. #define FULL_DELAY BIT10
  36. #define STOPCHECK BIT11
  37. #define EVOICE BIT12 /* keeps people -v */
  38. #define OPER BIT13
  39. #define chan_hasvoice(x) (x->flags & CHANVOICE)
  40. #define chan_hasop(x) (x->flags & CHANOP)
  41. #define chan_fakeop(x) (x->flags & FAKEOP)
  42. #define chan_sentop(x) (x->flags & SENTOP)
  43. #define chan_sentdeop(x) (x->flags & SENTDEOP)
  44. #define chan_sentkick(x) (x->flags & SENTKICK)
  45. #define chan_sentvoice(x) (x->flags & SENTVOICE)
  46. #define chan_sentdevoice(x) (x->flags & SENTDEVOICE)
  47. #define chan_issplit(x) (x->split > 0)
  48. #define chan_wasop(x) (x->flags & WASOP)
  49. #define chan_stopcheck(x) (x->flags & STOPCHECK)
  50. #define P_IGNORE 0
  51. #define P_DEOP 1
  52. #define P_KICK 2
  53. #define P_DELETE 3
  54. /* Why duplicate this struct for exempts and invites only under another
  55. * name? <cybah>
  56. */
  57. typedef struct maskstruct {
  58. struct maskstruct *next;
  59. time_t timer;
  60. char *mask;
  61. char *who;
  62. } masklist;
  63. /* Used for temporary bans, exempts and invites */
  64. typedef struct maskrec {
  65. struct maskrec *next;
  66. time_t expire,
  67. added,
  68. lastactive;
  69. int flags;
  70. char *mask,
  71. *desc,
  72. *user;
  73. } maskrec;
  74. extern maskrec *global_bans, *global_exempts, *global_invites;
  75. #define MASKREC_STICKY 1
  76. #define MASKREC_PERM 2
  77. /* For every channel i join */
  78. struct chan_t {
  79. memberlist *member;
  80. masklist *ban;
  81. masklist *exempt;
  82. masklist *invite;
  83. time_t jointime;
  84. time_t parttime;
  85. time_t no_op;
  86. int fighting;
  87. #ifdef G_BACKUP
  88. int backup_time; /* If non-0, set +backup when now>backup_time */
  89. #endif /* G_BACKUP */
  90. int maxmembers;
  91. int members;
  92. int do_opreq;
  93. char *topic;
  94. char *key;
  95. unsigned short int mode;
  96. };
  97. #define CHANINV BIT0 /* +i */
  98. #define CHANPRIV BIT1 /* +p */
  99. #define CHANSEC BIT2 /* +s */
  100. #define CHANMODER BIT3 /* +m */
  101. #define CHANTOPIC BIT4 /* +t */
  102. #define CHANNOMSG BIT5 /* +n */
  103. #define CHANLIMIT BIT6 /* -l -- used only for protecting modes */
  104. #define CHANKEY BIT7 /* +k */
  105. #define CHANANON BIT8 /* +a -- ircd 2.9 */
  106. #define CHANQUIET BIT9 /* +q -- ircd 2.9 */
  107. #define CHANNOCLR BIT10 /* +c -- bahamut */
  108. #define CHANREGON BIT11 /* +R -- bahamut */
  109. #define CHANMODR BIT12 /* +M -- bahamut */
  110. #define CHANNOCTCP BIT13 /* +C -- QuakeNet's ircu 2.10 */
  111. #define CHANLONLY BIT14 /* +r -- ircu 2.10.11 */
  112. #define MODES_PER_LINE_MAX 6
  113. /* For every channel i'm supposed to be active on */
  114. struct chanset_t {
  115. struct chanset_t *next;
  116. struct chan_t channel; /* current information */
  117. maskrec *bans, /* temporary channel bans */
  118. *exempts, /* temporary channel exempts */
  119. *invites; /* temporary channel invites */
  120. time_t added_ts; /* ..and when? */
  121. struct {
  122. char *op;
  123. int type;
  124. } cmode[MODES_PER_LINE_MAX]; /* parameter-type mode changes - */
  125. struct {
  126. char *op;
  127. } ccmode[MODES_PER_LINE_MAX]; /* parameter-type mode changes - */
  128. /* detect floods */
  129. time_t floodtime[FLOOD_CHAN_MAX];
  130. uint32_t status;
  131. uint32_t ircnet_status;
  132. int flood_pub_thr;
  133. time_t flood_pub_time;
  134. int flood_join_thr;
  135. time_t flood_join_time;
  136. int flood_deop_thr;
  137. time_t flood_deop_time;
  138. int flood_kick_thr;
  139. time_t flood_kick_time;
  140. int flood_ctcp_thr;
  141. time_t flood_ctcp_time;
  142. int flood_nick_thr;
  143. time_t flood_nick_time;
  144. int limitraise;
  145. int checklimit;
  146. int closed_ban;
  147. int closed_private;
  148. int closed_invite;
  149. int bad_cookie;
  150. int manop;
  151. int mdop;
  152. int mop;
  153. int voice_non_ident;
  154. /* Chanint template
  155. *int temp;
  156. */
  157. int idle_kick;
  158. int stopnethack_mode;
  159. int revenge_mode;
  160. time_t ban_time;
  161. time_t invite_time;
  162. time_t exempt_time;
  163. /* desired channel modes: */
  164. int mode_pls_prot; /* modes to enforce */
  165. int mode_mns_prot; /* modes to reject */
  166. int limit_prot; /* desired limit */
  167. /* queued mode changes: */
  168. int limit; /* new limit to set */
  169. size_t bytes; /* total bytes so far */
  170. size_t cbytes;
  171. int compat; /* to prevent mixing old/new modes */
  172. int floodnum[FLOOD_CHAN_MAX];
  173. int opreqtime[5]; /* remember when ops was requested */
  174. char *key; /* new key to set */
  175. char *rmkey; /* old key to remove */
  176. char pls[21]; /* positive mode changes */
  177. char mns[21]; /* negative mode changes */
  178. char key_prot[121]; /* desired password */
  179. /* Chanchar template
  180. *char temp[121];
  181. */
  182. char topic[121];
  183. char added_by[NICKLEN]; /* who added the channel? */
  184. char floodwho[FLOOD_CHAN_MAX][128];
  185. char deopd[NICKLEN]; /* last person deop'd (must change */
  186. char dname[81]; /* what the users know the channel as like !eggdev */
  187. char name[81]; /* what the servers know the channel as, like !ABCDEeggdev */
  188. };
  189. /* behavior modes for the channel */
  190. /* Chanflag template
  191. * #define CHAN_TEMP 0x0000
  192. */
  193. #define CHAN_ENFORCEBANS BIT0 /* kick people who match channel bans */
  194. #define CHAN_DYNAMICBANS BIT1 /* only activate bans when needed */
  195. #define CHAN_NOUSERBANS BIT2 /* don't let non-bots place bans */
  196. #define CHAN_CLOSED BIT3 /* Only users +o can join */
  197. #define CHAN_BITCH BIT4 /* be a tightwad with ops */
  198. #define CHAN_TAKE BIT5 /* When a bot gets opped, take the chan */
  199. #define CHAN_PROTECTOPS BIT6 /* re-op any +o people who get deop'd */
  200. #define CHAN_BOTBITCH BIT7 /* only let bots be opped? */
  201. #define CHAN_REVENGE BIT8 /* get revenge on bad people */
  202. #define CHAN_SECRET BIT9 /* don't advertise channel on botnet */
  203. #undef CHAN_10 /* BIT10 not used */
  204. #define CHAN_CYCLE BIT11 /* cycle the channel if possible */
  205. #define CHAN_INACTIVE BIT12 /* no irc support for this channel */
  206. #define CHAN_VOICE BIT13 /* a bot +y|y will voice *, except +q */
  207. #define CHAN_REVENGEBOT BIT14 /* revenge on actions against the bot */
  208. #define CHAN_NODESYNCH BIT15
  209. #define CHAN_FASTOP BIT16 /* Bots will not use +o-b to op (no cookies) */
  210. #define CHAN_PRIVATE BIT17 /* users need |o to access chan */
  211. #define CHAN_ACTIVE BIT18 /* like i'm actually on the channel and stuff */
  212. #define CHAN_PEND BIT19 /* just joined; waiting for end of WHO list */
  213. #define CHAN_FLAGGED BIT20 /* flagged during rehash for delete */
  214. #define CHAN_ASKEDBANS BIT21
  215. #define CHAN_ASKEDMODES BIT22 /* find out key-info on IRCu */
  216. #define CHAN_JUPED BIT23 /* Is channel juped */
  217. #define CHAN_STOP_CYCLE BIT24 /* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
  218. #define CHAN_AUTOOP BIT25
  219. #define CHAN_JOINING BIT26 /* attempting to join, dont flood with JOIN #chan */
  220. #define CHAN_ASKED_EXEMPTS BIT0
  221. #define CHAN_ASKED_INVITES BIT1
  222. #define CHAN_DYNAMICEXEMPTS BIT2
  223. #define CHAN_NOUSEREXEMPTS BIT3
  224. #define CHAN_DYNAMICINVITES BIT4
  225. #define CHAN_NOUSERINVITES BIT5
  226. /* prototypes */
  227. memberlist *ismember(struct chanset_t *, const char *);
  228. struct chanset_t *findchan(const char *name);
  229. struct chanset_t *findchan_by_dname(const char *name);
  230. /* is this channel +s/+p? */
  231. #define channel_hidden(chan) (chan->channel.mode & (CHANPRIV | CHANSEC))
  232. /* is this channel +t? */
  233. #define channel_optopic(chan) (chan->channel.mode & CHANTOPIC)
  234. #define channel_active(chan) (chan->status & CHAN_ACTIVE)
  235. #define channel_joining(chan) (chan->status & CHAN_JOINING)
  236. #define channel_pending(chan) (chan->status & CHAN_PEND)
  237. #define channel_bitch(chan) (chan->status & CHAN_BITCH)
  238. #define chan_bitch(chan) (chan->status & (CHAN_BITCH|CHAN_BOTBITCH))
  239. #define channel_botbitch(chan) (chan->status & CHAN_BOTBITCH)
  240. #define channel_nodesynch(chan) (chan->status & CHAN_NODESYNCH)
  241. #define channel_enforcebans(chan) (chan->status & CHAN_ENFORCEBANS)
  242. #define channel_revenge(chan) (chan->status & CHAN_REVENGE)
  243. #define channel_dynamicbans(chan) (chan->status & CHAN_DYNAMICBANS)
  244. #define channel_nouserbans(chan) (chan->status & CHAN_NOUSERBANS)
  245. #define channel_protectops(chan) (chan->status & CHAN_PROTECTOPS)
  246. #define channel_secret(chan) (chan->status & CHAN_SECRET)
  247. #define channel_cycle(chan) (chan->status & CHAN_CYCLE)
  248. #define channel_inactive(chan) (chan->status & CHAN_INACTIVE)
  249. #define channel_revengebot(chan) (chan->status & CHAN_REVENGEBOT)
  250. #define channel_dynamicexempts(chan) (chan->ircnet_status & CHAN_DYNAMICEXEMPTS)
  251. #define channel_nouserexempts(chan) (chan->ircnet_status & CHAN_NOUSEREXEMPTS)
  252. #define channel_dynamicinvites(chan) (chan->ircnet_status & CHAN_DYNAMICINVITES)
  253. #define channel_nouserinvites(chan) (chan->ircnet_status & CHAN_NOUSERINVITES)
  254. #define channel_juped(chan) (chan->status & CHAN_JUPED)
  255. #define channel_stop_cycle(chan) (chan->status & CHAN_STOP_CYCLE)
  256. #define channel_closed(chan) (chan->status & CHAN_CLOSED)
  257. #define channel_take(chan) (chan->status & CHAN_TAKE)
  258. #define channel_voice(chan) (chan->status & CHAN_VOICE)
  259. #define channel_fastop(chan) (chan->status & CHAN_FASTOP)
  260. #define channel_privchan(chan) (chan->status & CHAN_PRIVATE)
  261. #define channel_autoop(chan) (chan->status & CHAN_AUTOOP)
  262. /* Chanflag template
  263. *#define channel_temp(chan) (chan->status & CHAN_PRIVATE)
  264. */
  265. struct msgq_head {
  266. struct msgq *head;
  267. struct msgq *last;
  268. int tot;
  269. int warned;
  270. };
  271. /* Used to queue a lot of things */
  272. struct msgq {
  273. struct msgq *next;
  274. size_t len;
  275. char *msg;
  276. };
  277. #endif /* _EGG_CHAN_H */