flags.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * flags.h
  3. *
  4. */
  5. #ifndef _EGG_FLAGS_H
  6. #define _EGG_FLAGS_H
  7. #include "chan.h"
  8. /* For privchan() checking */
  9. #define PRIV_OP 1
  10. #define PRIV_VOICE 2
  11. typedef uint64_t flag_t;
  12. extern flag_t FLAG[128];
  13. struct flag_record {
  14. flag_t match;
  15. flag_t global;
  16. flag_t chan;
  17. char bot;
  18. };
  19. #define FR_GLOBAL 0x00000001
  20. #define FR_CHAN 0x00000002
  21. #define FR_BOT 0x00000004
  22. #define FR_ANYWH 0x10000000
  23. #define FR_ANYCH 0x20000000
  24. #define FR_AND 0x40000000
  25. #define FR_OR 0x80000000
  26. /*
  27. * userflags:
  28. * abcdefgh?jklmnopqr?tuvwxy?
  29. * + user defined A-Z
  30. * unused letters: isz
  31. *
  32. * botflags:
  33. * 0123456789ab????ghi??l???p?rs???????
  34. * unused letters: cdefjkmnoqtuvwxyz
  35. *
  36. * chanflags:
  37. * a??defg???klmno?qr??uv?xyz
  38. * + user defined A-Z
  39. * unused letters: bchijpstw
  40. */
  41. enum deflag_event_t {
  42. DEFLAG_EVENT_BADCOOKIE = 1,
  43. DEFLAG_EVENT_MANUALOP,
  44. DEFLAG_EVENT_REVENGE_DEOP,
  45. DEFLAG_EVENT_REVENGE_KICK,
  46. DEFLAG_EVENT_REVENGE_BAN,
  47. DEFLAG_EVENT_MDOP,
  48. DEFLAG_EVENT_MOP,
  49. };
  50. struct rolecount {
  51. const char* name;
  52. short role;
  53. int count;
  54. };
  55. extern struct rolecount role_counts[];
  56. #define ROLE_VOICE BIT0
  57. #define ROLE_FLOOD BIT1
  58. #define ROLE_OP BIT2
  59. #define ROLE_DEOP BIT3
  60. #define ROLE_KICK BIT4
  61. #define ROLE_BAN BIT5
  62. #define ROLE_TOPIC BIT6
  63. #define ROLE_LIMIT BIT7
  64. #define ROLE_RESOLV BIT8
  65. #define ROLE_REVENGE BIT9
  66. #define ROLE_CHANMODE BIT10
  67. #define ROLE_PROTECT BIT11
  68. #define ROLE_INVITE BIT12
  69. #define USER_DEFAULT 0
  70. #define USER_ADMIN FLAG[(int) 'a']
  71. #define USER_HUBA FLAG[(int) 'i']
  72. #define USER_CHUBA FLAG[(int) 'j']
  73. #define USER_PARTY FLAG[(int) 'p']
  74. #define USER_MASTER FLAG[(int) 'm']
  75. #define USER_OWNER FLAG[(int) 'n']
  76. #define USER_AUTOOP FLAG[(int) 'O']
  77. #define USER_DEOP FLAG[(int) 'd']
  78. #define USER_KICK FLAG[(int) 'k']
  79. #define USER_OP FLAG[(int) 'o']
  80. #define USER_QUIET FLAG[(int) 'q']
  81. #define USER_VOICE FLAG[(int) 'v']
  82. #define USER_NOFLOOD FLAG[(int) 'x']
  83. #define USER_WASOPTEST FLAG[(int) 'w']
  84. #define CHAN_VALID (flag_t) USER_DEOP|USER_KICK|USER_OP|USER_QUIET|USER_VOICE|USER_NOFLOOD|USER_WASOPTEST
  85. #define USER_CHAN_VALID (flag_t) CHAN_VALID|USER_AUTOOP|USER_MASTER|USER_OWNER
  86. #define USER_VALID (flag_t) USER_ADMIN|USER_HUBA|USER_CHUBA|USER_PARTY|USER_CHAN_VALID
  87. #define BOT_BACKUP FLAG[(int) 'B']
  88. #define BOT_CHANHUB FLAG[(int) 'c']
  89. #define BOT_FLOODBOT FLAG[(int) 'f']
  90. #define BOT_UPDATEHUB FLAG[(int) 'u']
  91. #define BOT_DORESOLV FLAG[(int) 'r']
  92. #define BOT_DOLIMIT FLAG[(int) 'l']
  93. #define BOT_DOVOICE FLAG[(int) 'y']
  94. #define BOT_CHAN_VALID (flag_t) CHAN_VALID|BOT_CHANHUB|BOT_DOLIMIT|BOT_DOVOICE|BOT_DORESOLV|BOT_BACKUP|BOT_FLOODBOT
  95. #define BOT_VALID (flag_t) BOT_CHAN_VALID|BOT_UPDATEHUB
  96. #define bot_hublevel(x) ( ( (x) && x->bot && (get_user(&USERENTRY_BOTADDR, x)) ) ? \
  97. ( ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel ? \
  98. ((struct bot_addr *) get_user(&USERENTRY_BOTADDR, x))->hublevel : 999) \
  99. : 999)
  100. #define glob_bot(x) ((x).bot)
  101. /* Flag checking macros
  102. */
  103. #define chan_op(x) ((x).chan & USER_OP)
  104. #define glob_op(x) ((x).global & USER_OP)
  105. #define chan_autoop(x) ((x).chan & USER_AUTOOP)
  106. #define glob_autoop(x) ((x).global & USER_AUTOOP)
  107. #define chan_deop(x) ((x).chan & USER_DEOP)
  108. #define glob_deop(x) ((x).global & USER_DEOP)
  109. #define glob_master(x) ((x).global & USER_MASTER)
  110. #define glob_owner(x) ((x).global & USER_OWNER)
  111. #define chan_master(x) ((x).chan & USER_MASTER)
  112. #define chan_owner(x) ((x).chan & USER_OWNER)
  113. #define chan_kick(x) ((x).chan & USER_KICK)
  114. #define glob_kick(x) ((x).global & USER_KICK)
  115. #define chan_voice(x) ((x).chan & USER_VOICE)
  116. #define glob_voice(x) ((x).global & USER_VOICE)
  117. #define chan_wasoptest(x) ((x).chan & USER_WASOPTEST)
  118. #define glob_wasoptest(x) ((x).global & USER_WASOPTEST)
  119. #define chan_quiet(x) ((x).chan & USER_QUIET)
  120. #define glob_quiet(x) ((x).global & USER_QUIET)
  121. #define glob_party(x) ((x).global & USER_PARTY)
  122. #define glob_hilite(x) ((x).global & USER_HIGHLITE)
  123. #define glob_admin(x) ((x).global & USER_ADMIN)
  124. #define glob_huba(x) ((x).global & USER_HUBA)
  125. #define glob_chuba(x) ((x).global & USER_CHUBA)
  126. #define glob_noflood(x) ((x).global & USER_NOFLOOD)
  127. #define chan_noflood(x) ((x).chan & USER_NOFLOOD)
  128. #define glob_dolimit(x) ((x).global & BOT_DOLIMIT)
  129. #define chan_dolimit(x) ((x).chan & BOT_DOLIMIT)
  130. #define glob_dovoice(x) ((x).global & BOT_DOVOICE)
  131. #define chan_dovoice(x) ((x).chan & BOT_DOVOICE)
  132. #define glob_chanhub(x) ((x).global & BOT_CHANHUB)
  133. #define glob_doresolv(x) ((x).global & BOT_DORESOLV)
  134. #define chan_doresolv(x) ((x).chan & BOT_DORESOLV)
  135. #define glob_backup(x) ((x).global & BOT_BACKUP)
  136. #define chan_backup(x) ((x).chan & BOT_BACKUP)
  137. #define glob_doflood(x) ((x).global & BOT_FLOODBOT)
  138. #define chan_doflood(x) ((x).chan & BOT_FLOODBOT)
  139. void init_flags(void);
  140. void get_user_flagrec(const struct userrec *, struct flag_record *, const char *, const struct chanset_t* = NULL);
  141. void set_user_flagrec(struct userrec *, struct flag_record *, const char *);
  142. void break_down_flags(const char *, struct flag_record *, struct flag_record *);
  143. int build_flags(char *, struct flag_record *, struct flag_record *);
  144. int flagrec_eq(struct flag_record *, struct flag_record *);
  145. int flagrec_ok(struct flag_record *, struct flag_record *);
  146. flag_t sanity_check(flag_t, int);
  147. flag_t chan_sanity_check(flag_t, int);
  148. char geticon(int);
  149. int privchan(const struct flag_record, const struct chanset_t *, int);
  150. #define chk_op(fr, chan) real_chk_op(fr, chan, 1)
  151. int real_chk_op(const struct flag_record, const struct chanset_t *, bool);
  152. int chk_autoop(memberlist *, const struct flag_record, const struct chanset_t *);
  153. #define chk_deop(fr, chan) real_chk_deop(fr, chan, 1)
  154. int real_chk_deop(const struct flag_record, const struct chanset_t *, bool);
  155. #define chk_voice(fr, chan) (\
  156. (\
  157. (!chan || (!privchan(fr, chan, PRIV_VOICE) && !chk_devoice(fr))) \
  158. && (chan_voice(fr) || (glob_voice(fr) && !chan_quiet(fr))) \
  159. ) ? 1 : 0)
  160. #define chk_noflood(fr) (chan_noflood(fr) || glob_noflood(fr))
  161. #define chk_devoice(fr) ((chan_quiet(fr) || (glob_quiet(fr) && !chan_voice(fr))) ? 1 : 0)
  162. #define isupdatehub() ((conf.bot->hub && conf.bot->u && (conf.bot->u->flags & BOT_UPDATEHUB)) ? 1 : 0)
  163. #define ischanhub() ((!conf.bot->hub && conf.bot->u && (conf.bot->u->flags & BOT_CHANHUB)) ? 1 : 0)
  164. int doresolv(const struct chanset_t *);
  165. int dovoice(const struct chanset_t *);
  166. int doflood(const struct chanset_t *);
  167. int dolimit(const struct chanset_t *);
  168. int whois_access(struct userrec *, struct userrec *);
  169. void deflag_user(struct userrec *, deflag_event_t, const char *, const struct chanset_t *);
  170. deflag_t deflag_translate(const char *);
  171. #endif /* _EGG_FLAGS_H */