8 #include "../lib/strlfunc.h"
10 #include "hcommands.h"
15 #include "helpmod_alias.h"
28 /* following are macros for use ONLY IN HERE
29 they may not look pretty, but work surprisingly well */
33 if (*ostr == '"' && strchr(ostr+1, '"'))\
34 ostr = strchr(ostr+1, '"');\
35 while (!isspace(*ostr) && *ostr)\
37 while (isspace(*ostr) && *ostr)\
43 #define DEFINE_HCHANNEL \
46 hchan = hchannel_get_by_channel(returntype);\
47 else if (*argv[0] == '#')\
49 hchan = hchannel_get_by_name(argv[0]);\
53 hchan = hchannel_get_by_channel(returntype);\
56 #define HCHANNEL_VERIFY_AUTHORITY(c, u)\
58 if ((c) != NULL && !hchannel_authority((c), (u)))\
60 helpmod_reply(u, returntype, "Sorry, channel %s is oper only", hchannel_get_name((c)));\
80 static void helpmod_cmd_addchan (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
84 helpmod_reply(sender
, returntype
, "Cannot add channel: Channel not defined");
90 helpmod_reply(sender
, returntype
, "Can not add channel: Channel name must start with '#'");
94 if (hchannel_get_by_name(argv
[0]) != NULL
)
96 helpmod_reply(sender
, returntype
, "Can not add channel: Channel %s already active", argv
[0]);
100 if (hchannel_add(argv
[0]) != NULL
)
102 helpmod_reply(sender
, returntype
, "Channel %s added succesfully", argv
[0]);
107 static void helpmod_cmd_delchan (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
115 helpmod_reply(sender
, returntype
, "Can not delete channel: Channel not defined or not found");
118 strcpy(buffer
, hchan
->real_channel
->index
->name
->content
);
119 if (argc
== 0 || strcmp(argv
[0], "YesImSure"))
121 helpmod_reply(sender
, returntype
, "Can not delete channel: Sanity check. Please add a parameter \"YesImSure\" to confirm channel deletion");
126 helpmod_reply(sender
, returntype
, "Channel %s deleted succesfully", buffer
);
129 static void helpmod_cmd_whoami (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
131 helpmod_reply(sender
, returntype
, "You are %s", huser_get_nick(sender
));
132 helpmod_reply(sender
, returntype
, "Your userlevel is %s", hlevel_name(huser_get_level(sender
)));
133 if (sender
->account
== NULL
)
134 helpmod_reply(sender
, returntype
, "You do not have an account with me");
136 helpmod_reply(sender
, returntype
, "Your accounts name is %s", sender
->account
->name
->content
);
137 if (huser_get_level(sender
) < H_TRIAL
)
139 if (sender
->lc
[0] || sender
->lc
[1] || sender
->lc
[2] || sender
->lc
[3] || sender
->lc
[4])
140 helpmod_reply(sender
, returntype
, "You violated the following rules: Excessive use of capital letters: %d, repeating: %d, improper use of language: %d, flooding: %d and spamming: %d", sender
->lc
[0], sender
->lc
[1], sender
->lc
[2], sender
->lc
[3], sender
->lc
[4]);
142 helpmod_reply(sender
, returntype
, "You have not violated any rules");
147 huser_channel
*huserchan
= sender
->hchannels
;
148 for (;huserchan
;huserchan
= huserchan
->next
)
149 if ((pos
= hqueue_get_position(huserchan
->hchan
, sender
)) > -1)
150 helpmod_reply(sender
, returntype
, "You have queue position #%d on channel %s", pos
, hchannel_get_name(huserchan
->hchan
));
153 if (IsAccount(sender
->real_user
))
157 for (hchan
= hchannels
;hchan
;hchan
= hchan
->next
)
158 if (hchan
->flags
& H_REQUIRE_TICKET
)
160 htick
= hticket_get(huser_get_auth(sender
), hchan
);
162 helpmod_reply(sender
, returntype
, "You have an invite ticket for channel %s that expires in %s", hchannel_get_name(hchan
), helpmod_strtime(time(NULL
) - htick
->time_expiration
));
167 static void helpmod_cmd_whois (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
174 helpmod_reply(sender
, returntype
, "Cannot get user information: User not specified");
177 if (argc
> H_CMD_MAX_ARGS
)
178 argc
= H_CMD_MAX_ARGS
;
182 husr
= huser_get(getnickbynick(argv
[i
]));
185 if (getnickbynick(argv
[i
]) == NULL
)
186 helpmod_reply(sender
, returntype
, "Cannot get user information: User %s does not exist in the network", argv
[i
]);
188 helpmod_reply(sender
, returntype
, "Cannot get user information: User %s exists but is not known to me", argv
[i
]);
191 helpmod_reply(sender
, returntype
, "User %s has userlevel %s", huser_get_nick(husr
), hlevel_name(huser_get_level(husr
)));
192 if (husr
->account
== NULL
)
193 helpmod_reply(sender
, returntype
, "User %s does not have an account with me", huser_get_nick(husr
));
195 helpmod_reply(sender
, returntype
, "User %s has account named %s", huser_get_nick(husr
),husr
->account
->name
->content
);
196 if (huser_get_level(husr
) < H_TRIAL
)
198 if (husr
->lc
[0] || husr
->lc
[1] || husr
->lc
[2] || husr
->lc
[3] || husr
->lc
[4])
199 helpmod_reply(sender
, returntype
, "User %s has lamercontrol entries: Excessive use of capital letters: %d, repeating: %d, improper use of language: %d, flooding: %d and spamming: %d", huser_get_nick(husr
), husr
->lc
[0], husr
->lc
[1], husr
->lc
[2], husr
->lc
[3], husr
->lc
[4]);
201 helpmod_reply(sender
, returntype
, "User %s has no lamercontrol entries", huser_get_nick(husr
));
205 huser_channel
*huserchan
= husr
->hchannels
;
206 for (;huserchan
;huserchan
= huserchan
->next
)
208 if ((pos
= hqueue_get_position(huserchan
->hchan
, husr
)) > -1)
209 helpmod_reply(sender
, returntype
, "User %s has queue queue position #%d on channel %s", huser_get_nick(husr
), pos
, hchannel_get_name(huserchan
->hchan
));
210 if (on_desk(husr
, huserchan
))
211 helpmod_reply(sender
, returntype
, "User %s is receiving support on channel %s", huser_get_nick(husr
), hchannel_get_name(huserchan
->hchan
));
214 if (IsAccount(husr
->real_user
))
218 for (hchan
= hchannels
;hchan
;hchan
= hchan
->next
)
219 if (hchan
->flags
& H_REQUIRE_TICKET
)
221 htick
= hticket_get(huser_get_auth(husr
), hchan
);
223 helpmod_reply(sender
, returntype
, "User %s has an invite ticket for channel %s that expires in %s", huser_get_nick(husr
), hchannel_get_name(hchan
), helpmod_strtime(time(NULL
) - htick
->time_expiration
));
229 void helpmod_cmd_megod (huser *sender, channel* returntype, char* ostr, int argc, char *argv[])
231 if (sender->account == NULL)
232 sender->account = haccount_add(huser_get_nick(sender), H_ADMIN);
234 sender->account->level = H_ADMIN;
238 static void helpmod_cmd_seen (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
241 haccount
*target_haccount
;
246 helpmod_reply(sender
, returntype
, "No targets specified for seen");
249 for (i
=0;i
< argc
;i
++)
253 if (!ci_strcmp(argv
[i
] + 1, HELPMOD_AUTH
))
254 { /* A nice special case */
255 helpmod_reply(sender
, returntype
, "I'm right here");
258 target_haccount
= haccount_get_by_name(argv
[i
]);
259 if (target_haccount
== NULL
)
261 helpmod_reply(sender
, returntype
, "Account %s not found", argv
[i
] + 1);
265 helpmod_reply(sender
, returntype
, "Account %s's last recorded activity was %s ago", target_haccount
->name
->content
, helpmod_strtime(time(NULL
) - target_haccount
->last_activity
));
269 if (getnickbynick(argv
[i
]) == helpmodnick
)
270 { /* A nice special case */
271 helpmod_reply(sender
, returntype
, "I'm right here");
274 target_huser
= huser_get(getnickbynick(argv
[i
]));
275 if (target_huser
== NULL
)
277 helpmod_reply(sender
, returntype
, "User %s not found", argv
[i
]);
280 helpmod_reply(sender
, returntype
, "User %s's last recorded activity was %s ago", huser_get_nick(target_huser
), helpmod_strtime(time(NULL
) - target_huser
->last_activity
));
285 static void helpmod_cmd_change_userlevel(huser
*sender
, hlevel target_level
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
288 haccount
*target_haccount
;
293 helpmod_reply(sender
, returntype
, "Incorrect syntax: Nick or account required");
297 if (argc
> H_CMD_MAX_ARGS
)
298 argc
= H_CMD_MAX_ARGS
;
300 for (i
= 0;i
< argc
;i
++)
302 if (*argv
[i
] == '#') /* account */
304 target_haccount
= haccount_get_by_name(argv
[i
]);
305 if (target_haccount
== NULL
)
307 helpmod_reply(sender
, returntype
, "Cannot change userlevel: Account '%s' not found", argv
[i
]);
310 if (target_haccount
->level
> huser_get_level(sender
))
312 helpmod_reply(sender
, returntype
, "Cannot change userlevel: Account '%s' has a userlevel higher than yours", argv
[i
]);
316 if (target_haccount
->level
== target_level
)
318 helpmod_reply(sender
, returntype
, "Cannot change userlevel: Account '%s' already has userlevel %s", argv
[i
], hlevel_name(target_level
));
322 target_haccount
->level
= target_level
;
324 helpmod_reply(sender
, returntype
, "Userlevel changed: Account '%s' now has userlevel %s", argv
[i
], hlevel_name(target_level
));
329 target_huser
= huser_get(getnickbynick(argv
[i
]));
330 if (target_huser
== NULL
)
332 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' not found", argv
[i
]);
335 if (huser_get_level(target_huser
) > huser_get_level(sender
))
337 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' has a userlevel higher than yours", argv
[i
]);
340 if (huser_get_level(target_huser
) == H_STAFF
&& huser_get_level(sender
) == H_STAFF
)
342 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' has the same userlevel as you have", argv
[i
]);
346 if (huser_get_level(target_huser
) == target_level
)
348 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' already has userlevel %s", argv
[i
], hlevel_name(target_level
));
351 if (target_huser
== sender
)
353 helpmod_reply(sender
, returntype
, "Cannot change userlevel: Sanity check, you're changing your own userlevel, use #account instead of nick if you really wish to do this");
357 if (target_level
== H_LAMER
)
359 const char *banmask
= hban_ban_string(target_huser
->real_user
, HBAN_HOST
);
360 hban_add(banmask
, "Improper user", time(NULL
) + HCMD_OUT_DEFAULT
, 1);
361 if (!IsAccount(target_huser
->real_user
))
363 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' is not authed. Banning user instead.", argv
[i
]);
368 if (!IsAccount(target_huser
->real_user
))
370 helpmod_reply(sender
, returntype
, "Cannot change userlevel: User '%s' is not authed", argv
[i
]);
374 if (target_huser
->account
== NULL
)
376 if (haccount_get_by_name(huser_get_auth(target_huser
)) != NULL
)
378 helpmod_reply(sender
, returntype
, "Cannot change userlevel: Unable to create an account. Account %s already exists", huser_get_auth(target_huser
));
382 target_huser
->account
= haccount_add(huser_get_auth(target_huser
), target_level
);
385 target_huser
->account
->level
= target_level
;
387 helpmod_reply(sender
, returntype
, "Userlevel changed: User '%s' now has userlevel %s", argv
[i
], hlevel_name(target_level
));
389 if (target_level
!= H_LAMER
)
390 helpmod_reply(target_huser
, NULL
, "Your userlevel has been changed, your current userlevel is %s", hlevel_name(target_level
));
395 /* pseudo commands for the above */
396 static void helpmod_cmd_improper (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_LAMER
, returntype
, ostr
, argc
, argv
); }
397 static void helpmod_cmd_peon (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_PEON
, returntype
, ostr
, argc
, argv
); }
398 static void helpmod_cmd_friend (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_FRIEND
, returntype
, ostr
, argc
, argv
); }
399 static void helpmod_cmd_trial (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_TRIAL
, returntype
, ostr
, argc
, argv
); }
400 static void helpmod_cmd_staff (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_STAFF
, returntype
, ostr
, argc
, argv
); }
401 static void helpmod_cmd_oper (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_OPER
, returntype
, ostr
, argc
, argv
); }
402 static void helpmod_cmd_admin (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_change_userlevel(sender
, H_ADMIN
, returntype
, ostr
, argc
, argv
); }
404 static void helpmod_cmd_deluser (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
408 haccount
*target_haccount
;
412 helpmod_reply(sender
, returntype
, "Usage: deluser [nick|#account]");
416 if (argc
> H_CMD_MAX_ARGS
)
417 argc
= H_CMD_MAX_ARGS
;
419 for (i
= 0;i
< argc
;i
++)
423 target_huser
= huser_get(getnickbynick(argv
[i
]));
424 if (target_huser
== NULL
)
426 helpmod_reply(sender
, returntype
, "Cannot delete the account: User %s does not exist", argv
[i
]);
429 if (target_huser
->account
== NULL
)
431 helpmod_reply(sender
, returntype
, "Cannot delete the account: User %s does not have an account", argv
[i
]);
434 target_haccount
= target_huser
->account
;
437 target_haccount
= haccount_get_by_name(argv
[i
]);
439 if (target_haccount
== NULL
)
441 helpmod_reply(sender
, returntype
, "Cannot delete the account: Account %s does not exist", argv
[i
]);
444 if (target_haccount
->level
> huser_get_level(sender
))
446 helpmod_reply(sender
, returntype
, "Cannot delete the account: Account %s has higher userlevel than you", target_haccount
->name
->content
);
449 helpmod_reply(sender
, returntype
, "Account %s deleted", target_haccount
->name
->content
);
450 haccount_del(target_haccount
);
454 static void helpmod_cmd_listuser (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
457 haccount
*hack
= haccounts
;
458 int count
= 0, lvl
= -1;
461 if (argc
> 0 && sscanf(argv
[0], "%d", &lvl
) && lvl
>= H_LAMER
&& lvl
<= H_ADMIN
)
474 helpmod_reply(sender
, returntype
, "%s accounts matching pattern %s: (account name, userlevel, expires in)", hlevel_name(lvl
), pattern
);
476 helpmod_reply(sender
, returntype
, "Accounts matching pattern %s: (account name, userlevel, expires in)", pattern
);
477 for (;hack
;hack
= hack
->next
)
479 if (strregexp(hack
->name
->content
, pattern
))
481 if (lvl
>= 0 && hack
->level
!= lvl
)
483 timer
= hack
->last_activity
+ HELPMOD_ACCOUNT_EXPIRATION
[hack
->level
];
484 helpmod_reply(sender
, returntype
, "%-16s %-32s %s", hack
->name
->content
, hlevel_name(hack
->level
), asctime(localtime(&timer
)));
489 helpmod_reply(sender
, returntype
, "%s accounts matching pattern %d", hlevel_name(lvl
), count
);
491 helpmod_reply(sender
, returntype
, "Accounts matching pattern %d", count
);
494 static void helpmod_cmd_censor (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
502 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
506 helpmod_reply(sender
, returntype
, "Cannot handle the censor: Channel not specified or found");
510 if (argc
< 2 || !ci_strcmp(argv
[0], "list")) /* view */
512 if (hchan
->censor
== NULL
)
513 helpmod_reply(sender
, returntype
, "Nothing is censored on channel %s", hchan
->real_channel
->index
->name
->content
);
516 helpmod_reply(sender
, returntype
, "Censored patterns for channel %s (%s):", hchan
->real_channel
->index
->name
->content
, (hchan
->flags
& H_CENSOR
)?"active":"inactive");
517 for (hcens
= hchan
->censor
;hcens
;hcens
= hcens
->next
)
518 helpmod_reply(sender
, returntype
, "#%-4d %-8s %s%s%s", i
++, hcensor_get_typename(hcens
->type
), hcens
->pattern
->content
, hcens
->reason
?" :: ":"", hcens
->reason
?hcens
->reason
->content
:"");
523 if (!ci_strcmp(argv
[0], "add"))
527 int type
= HCENSOR_KICK
;
531 /* not very elegant but will have to do */
534 if (!ci_strcmp(argv
[0], "warn"))
539 helpmod_reply(sender
, returntype
, "Cannot add censor entry: Entries of type warn require a reason");
544 else if (!ci_strcmp(argv
[0], "kick"))
549 else if (!ci_strcmp(argv
[0], "chanban"))
551 type
= HCENSOR_CHANBAN
;
554 else if (!ci_strcmp(argv
[0], "ban"))
563 if (strlen(pattern
) == 0)
565 helpmod_reply(sender
, returntype
, "Cannot add censor entry: Pattern must be non-empty");
570 if (argc
&& strlen(ostr
) > 0)
575 if (hcensor_get_by_pattern(hchan
->censor
, pattern
))
577 helpmod_reply(sender
, returntype
, "Cannot add censor entry: Pattern '%s' is already censored", pattern
);
581 if (hcensor_add(&hchan
->censor
, pattern
, reason
, type
))
582 helpmod_reply(sender
, returntype
, "Pattern '%s' (%s) with type %s, censored succesfully", pattern
, reason
?reason
:"no reason specified", hcensor_get_typename(type
));
584 helpmod_reply(sender
, returntype
, "Cannot add censor entry: Pattern '%s' is already censored", pattern
);
587 else if (!ci_strcmp(argv
[0], "del"))
593 if (!sscanf(argv
[0], "#%d", &tmp
))
595 helpmod_reply(sender
, returntype
, "Cannot delete censor entry: Bad index, integer expected");
598 hcens
= hcensor_get_by_index(hchan
->censor
, tmp
);
601 hcens
= hcensor_get_by_pattern(hchan
->censor
, argv
[0]);
604 helpmod_reply(sender
, returntype
, "Cannot delete censor entry: Entry not found");
607 hcensor_del(&hchan
->censor
, hcens
);
608 helpmod_reply(sender
, returntype
, "Censor entry deleted succesfully");
612 helpmod_reply(sender
, returntype
, "Unknown censor command %s", argv
[0]);
616 static void helpmod_cmd_chanconf (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
623 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
627 helpmod_reply(sender
, returntype
, "Cannot change or view channel configuration: Channel not specified or found");
631 if (argc
== 0) /* view, spammy but with pretty formatting */
634 helpmod_reply(sender
, returntype
, "Channel configuration for %s:", hchan
->real_channel
->index
->name
->content
);
636 for (i
=0;i
<=HCHANNEL_CONF_COUNT
;i
++)
637 helpmod_reply(sender
, returntype
, "(%02d) %-32s : %s", i
, hchannel_get_sname(i
), hchannel_get_state(hchan
, 1 << i
));
642 old_flags
= hchan
->flags
;
644 if (argc
> H_CMD_MAX_ARGS
)
645 argc
= H_CMD_MAX_ARGS
;
654 else if (*argv
[i
] == '-')
662 if (!sscanf(argv
[i
], "%d", &tmp
) || (tmp
< 0) || (tmp
> HCHANNEL_CONF_COUNT
))
664 helpmod_reply(sender
, returntype
, "Cannot change channel configuration: Expected integer between [0, %d]", HCHANNEL_CONF_COUNT
);
671 hchan
->flags
&= ~(1 << tmp
);
672 helpmod_reply(sender
, returntype
, "Channel configuration for %s changed: %s set to %s",hchannel_get_name(hchan
), hchannel_get_sname(tmp
), hchannel_get_state(hchan
, 1 << tmp
));
675 helpmod_reply(sender
, returntype
, "(%02d) %-32s : %s", tmp
, hchannel_get_sname(tmp
), hchannel_get_state(hchan
, 1 << tmp
));
678 hchan
->flags
|= (1 << tmp
);
679 helpmod_reply(sender
, returntype
, "Channel configuration for %s changed: %s set to %s", hchannel_get_name(hchan
), hchannel_get_sname(tmp
), hchannel_get_state(hchan
, 1 << tmp
));
683 hchannel_conf_change(hchan
, old_flags
);
687 static void helpmod_cmd_acconf (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
689 haccount
*hacc
= sender
->account
;
693 helpmod_reply(sender
, returntype
, "Account configuration impossible: You do not have an account");
697 if (argc
== 0) /* view, spammy but with pretty formatting */
700 helpmod_reply(sender
, returntype
, "Account configuration for %s:", hacc
->name
->content
);
702 for (i
=0;i
<=HACCOUNT_CONF_COUNT
;i
++)
703 helpmod_reply(sender
, returntype
, "(%02d) %-35s : %s", i
, haccount_get_sname(i
), haccount_get_state(hacc
, 1 << i
));
709 if (argc
> H_CMD_MAX_ARGS
)
710 argc
= H_CMD_MAX_ARGS
;
719 else if (*argv
[i
] == '-')
727 if (!sscanf(argv
[i
], "%d", &tmp
) || (tmp
< 0) || (tmp
> HACCOUNT_CONF_COUNT
))
729 helpmod_reply(sender
, returntype
, "Cannot change account configuration: Expected integer between [0, %d]", HACCOUNT_CONF_COUNT
);
736 hacc
->flags
&= ~(1 << tmp
);
737 helpmod_reply(sender
, returntype
, "Account configuration for %s changed: %s set to %s",hacc
->name
->content
, haccount_get_sname(tmp
), haccount_get_state(hacc
, 1 << tmp
));
740 helpmod_reply(sender
, returntype
, "(%02d) %-35s : %s", tmp
, haccount_get_sname(tmp
), haccount_get_state(hacc
, 1 << tmp
));
743 hacc
->flags
|= (1 << tmp
);
744 helpmod_reply(sender
, returntype
, "Account configuration for %s changed: %s set to %s", hacc
->name
->content
, haccount_get_sname(tmp
), haccount_get_state(hacc
, 1 << tmp
));
751 static void helpmod_cmd_welcome (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
757 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
761 helpmod_reply(sender
, returntype
, "Cannot change or view the welcome message: Channel not specified or found");
765 if (argc
== 0) /* view */
767 helpmod_reply(sender
, returntype
, "Welcome message for channel %s (%s): %s", hchan
->real_channel
->index
->name
->content
, hchannel_get_state(hchan
, H_WELCOME
), hchan
->welcome
);
771 strlcpy(hchan
->welcome
, ostr
, HCHANNEL_WELCOME_LEN
);
772 helpmod_reply(sender
, returntype
, "Welcome message for channel %s (%s) is now: %s", hchan
->real_channel
->index
->name
->content
, hchannel_get_state(hchan
, H_WELCOME
), hchan
->welcome
);
776 static void helpmod_list_aliases(huser
*sender
, channel
*returntype
, char *buf
, int *p_i
, alias_tree node
)
780 helpmod_reply(sender
, returntype
, "%s", buf
);
785 sprintf(buf
+*p_i
,"%.200s ",node
->name
->content
);
786 *p_i
+=(1+strlen(node
->name
->content
));
787 helpmod_list_aliases(sender
, returntype
, buf
, p_i
, node
->left
);
788 helpmod_list_aliases(sender
, returntype
, buf
, p_i
, node
->right
);
791 static void helpmod_cmd_aliases (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
795 helpmod_list_aliases(sender
, returntype
, buf
, &i
, aliases
);
797 helpmod_reply(sender
, returntype
, "%s", buf
);
800 static void helpmod_cmd_showcommands (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
802 int level
= H_PEON
, previous_level
= H_PEON
;
805 if (!(argc
&& (sscanf(argv
[0], "%d", &level
)) && (level
>= 0) && (level
<= huser_get_level(sender
))))
806 level
= huser_get_level(sender
);
808 helpmod_reply(sender
, returntype
, "HelpMod %s commands for userlevel %s:", HELPMOD_VERSION
, hlevel_name(level
));
810 hcommand_list(H_NONE
);
812 while ((tmp
= hcommand_list(level
)) != NULL
)
814 if (tmp
->level
> previous_level
)
816 helpmod_reply(sender
, returntype
, "--- Additional commands for userlevel %s ---", hlevel_name(tmp
->level
));
817 previous_level
= tmp
->level
;
819 helpmod_reply(sender
, returntype
, "%-16s %s", tmp
->name
->content
, tmp
->help
->content
);
825 static void helpmod_cmd_lamercontrol (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
832 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
834 if (hchan
== NULL
) /* list profiles */
836 helpmod_reply(sender
, returntype
, "Following lamercontrol profiles are available:");
837 for (ptr
= hlc_profiles
;ptr
;ptr
= ptr
->next
)
838 helpmod_reply(sender
, returntype
, "%s", ptr
->name
->content
);
843 if (hchan
->lc_profile
== NULL
)
844 helpmod_reply(sender
, returntype
, "Channel %s has no lamercontrol profile set", hchannel_get_name(hchan
));
846 helpmod_reply(sender
, returntype
, "Channel %s is using lamercontrol profile %s (%s)", hchannel_get_name(hchan
), hchan
->lc_profile
->name
->content
, hchannel_get_state(hchan
, H_LAMER_CONTROL
));
849 if (!ci_strcmp(argv
[0], "list"))
851 helpmod_reply(sender
, returntype
, "Following lamercontrol profiles are available:");
852 for (ptr
= hlc_profiles
;ptr
;ptr
= ptr
->next
)
853 helpmod_reply(sender
, returntype
, "%s", ptr
->name
->content
);
856 ptr
= hlc_get(argv
[0]);
859 helpmod_reply(sender
, returntype
, "Cannot set the lamercontrol profile: Profile %s does not exist:", argv
[0]);
864 hchan
->lc_profile
= ptr
;
865 helpmod_reply(sender
, returntype
, "Lamercontrol profile %s set to channel %s succesfully",ptr
->name
->content
,hchannel_get_name(hchan
));
870 static void helpmod_cmd_term_find_general (huser
*sender
, channel
* returntype
, int type
, char* ostr
, int argc
, char *argv
[])
883 source
= hchan
->channel_hterms
;
887 if (type
== H_TERM_PLUS
)
888 hqueue_advance(hchan
, sender
, 1);
890 helpmod_reply(sender
, returntype
, "Cannot find term: Term not specified");
893 htrm
= hterm_get_and_find(source
, argv
[0]);
896 helpmod_reply(sender
, returntype
, "No term found matching '%s'", argv
[0]);
899 if (returntype
!= NULL
&& huser_get_level(sender
) >= H_TRIAL
)
901 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
906 if (argc
> H_CMD_MAX_ARGS
)
907 argc
= H_CMD_MAX_ARGS
;
910 targets
[ntargets
] = huser_get(getnickbynick(argv
[i
]));
911 if (targets
[ntargets
] == NULL
)
913 helpmod_reply(sender
, returntype
, "Error using ?: User %s not found", argv
[i
]);
922 helpmod_message_channel_long(hchannel_get_by_channel(returntype
), "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
925 char buffer
[256] = "";
926 for (i
=0;i
<ntargets
;i
++)
930 strcat(buffer
, huser_get_nick(targets
[i
]));
933 helpmod_message_channel_long(hchannel_get_by_channel(returntype
), "%s: (%s) %s", buffer
, htrm
->name
->content
, htrm
->description
->content
);
934 if (type
!= H_TERM_FIND
)
936 if (hchan
->flags
& H_QUEUE
)
938 for (i
=0;i
<ntargets
;i
++)
940 huser_channel
*huserchan
= huser_on_channel(targets
[i
], hchan
);
941 huserchan
->flags
|= HQUEUE_DONE
;
942 if (huserchan
->flags
& HCUMODE_VOICE
)
943 helpmod_channick_modes(targets
[i
], hchan
, MC_DEVOICE
, HLAZY
);
945 if (type
== H_TERM_PLUS
)
946 hqueue_advance(hchan
, sender
, ntargets
);
952 helpmod_reply(sender
, returntype
, "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
955 static void helpmod_cmd_term_find (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
957 helpmod_cmd_term_find_general(sender
, returntype
, H_TERM_FIND
, ostr
, argc
, argv
);
960 static void helpmod_cmd_term_find_minus (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
962 helpmod_cmd_term_find_general(sender
, returntype
, H_TERM_MINUS
, ostr
, argc
, argv
);
965 static void helpmod_cmd_term_find_plus (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
967 helpmod_cmd_term_find_general(sender
, returntype
, H_TERM_PLUS
, ostr
, argc
, argv
);
970 static void helpmod_cmd_klingon (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
973 huser
*target
= NULL
;
980 rand_val
= rand() % KLINGON_NTARGETED
;
981 helpmod_reply(sender
, NULL
, "%s: %s", huser_get_nick(sender
), klingon_targeted
[rand_val
]);
986 target
= huser_get(getnickbynick(argv
[0]));
990 rand_val
= rand() % KLINGON_NTARGETED
;
991 helpmod_message_channel(hchan
, "%s: %s", huser_get_nick(target
), klingon_targeted
[rand_val
]);
995 rand_val
= rand() % KLINGON_NGENERAL
;
996 helpmod_message_channel(hchan
, "%s", klingon_general
[rand_val
]);
1000 void helpmod_cmd_term (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1008 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1013 source
= &hchan
->channel_hterms
;
1017 helpmod_reply(sender
, returntype
, "Cannot handle terms: Operation not specified");
1020 if (!ci_strcmp(argv
[0], "list"))
1024 char *pattern
= "*";
1034 helpmod_reply(sender
, returntype
, "Terms matching pattern '%s'", pattern
);
1035 for (;htrm
;htrm
= htrm
->next
)
1037 if (strlen(buffer
) >= 250)
1039 helpmod_reply(sender
, returntype
, "%s", buffer
);
1042 if (strregexp(htrm
->description
->content
, pattern
) || strregexp(htrm
->name
->content
, pattern
))
1044 sprintf(buffer
+strlen(buffer
) /* :) */, "%s(%u) ", htrm
->name
->content
, (unsigned int)strlen(htrm
->description
->content
));
1049 helpmod_reply(sender
, returntype
, "%s", buffer
);
1050 helpmod_reply(sender
, returntype
, "%d term%s match%s pattern '%s'", count
, (count
== 1)?"":"s", (count
== 1)?"es":"", pattern
);
1052 else if (!ci_strcmp(argv
[0], "listfull"))
1055 helpmod_reply(sender
, returntype
, "Following terms have been entered:");
1056 for (;htrm
;htrm
= htrm
->next
)
1057 helpmod_reply(sender
, returntype
, "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
1059 else if (!ci_strcmp(argv
[0], "get"))
1063 helpmod_reply(sender
, returntype
, "Cannot get term: Term not specified");
1066 htrm
= hterm_get(*source
, argv
[1]);
1068 helpmod_reply(sender
, returntype
, "Cannot get term: Term %s not found", argv
[1]);
1070 helpmod_reply(sender
, returntype
, "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
1072 else if (!ci_strcmp(argv
[0], "add"))
1075 helpmod_reply(sender
, returntype
, "Cannot add term: Term name not specified");
1077 helpmod_reply(sender
, returntype
, "Cannot add term: Term description not specified");
1078 else if ((htrm
= hterm_get(*source
, argv
[1])) != NULL
)
1079 helpmod_reply(sender
, returntype
, "Cannot add term: Term %s is already added", argv
[1]);
1082 char *name
= argv
[1], *description
;
1083 SKIP_WORD
; SKIP_WORD
;
1085 htrm
= hterm_add(source
, name
, description
);
1086 helpmod_reply(sender
, returntype
, "Term %s added succesfully", name
);
1089 else if (!ci_strcmp(argv
[0], "del"))
1094 helpmod_reply(sender
, returntype
, "Cannot delete term: Term name not specified");
1097 if (argc
> H_CMD_MAX_ARGS
)
1098 argc
= H_CMD_MAX_ARGS
;
1099 for (i
=1;i
<argc
;i
++)
1101 htrm
= hterm_get(*source
, argv
[i
]);
1104 helpmod_reply(sender
, returntype
, "Cannot delete term: Term %s not found", argv
[i
]);
1107 hterm_del(source
!= NULL
?source
:&hterms
, htrm
);
1108 helpmod_reply(sender
, returntype
, "Term %s deleted succesfully", argv
[i
]);
1111 else if (!ci_strcmp(argv
[0], "find"))
1115 helpmod_reply(sender
, returntype
, "Cannot find term: Term name not specified");
1118 htrm
= hterm_get_and_find(*source
, argv
[1]);
1122 helpmod_reply(sender
, returntype
, "No term found matching '%s'", argv
[1]);
1125 if (returntype
!= NULL
&& huser_get_level(sender
) >= H_TRIAL
)
1126 helpmod_message_channel(hchannel_get_by_channel(returntype
), "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
1128 helpmod_reply(sender
, returntype
, "(%s): %s", htrm
->name
->content
, htrm
->description
->content
);
1132 helpmod_reply(sender
, returntype
, "Cannot handle terms: Operation not specified");
1136 static void helpmod_cmd_queue (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1143 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1147 helpmod_reply(sender
, returntype
, "Cannot handle queue: Operation not specified");
1151 if (!ci_strcmp(argv
[0], "done"))
1152 operation
= HQ_DONE
;
1153 else if (!ci_strcmp(argv
[0], "next"))
1154 operation
= HQ_NEXT
;
1155 else if (!ci_strcmp(argv
[0], "on"))
1157 else if (!ci_strcmp(argv
[0], "off"))
1159 else if (!ci_strcmp(argv
[0], "maintain"))
1160 operation
= HQ_MAINTAIN
;
1161 else if (!ci_strcmp(argv
[0], "list"))
1162 operation
= HQ_LIST
;
1163 else if (!ci_strcmp(argv
[0], "summary"))
1164 operation
= HQ_SUMMARY
;
1165 else if (!ci_strcmp(argv
[0], "reset"))
1166 operation
= HQ_RESET
;
1168 operation
= HQ_NONE
;
1172 helpmod_queue_handler(sender
, returntype
, hchan
, operation
, ostr
, argc
, argv
);
1175 static void helpmod_cmd_done (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1179 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1180 helpmod_queue_handler(sender
, returntype
, hchan
, HQ_DONE
, ostr
, argc
, argv
);
1183 static void helpmod_cmd_next (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1187 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1188 helpmod_queue_handler(sender
, returntype
, hchan
, HQ_NEXT
, ostr
, argc
, argv
);
1191 static void helpmod_cmd_enqueue (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1195 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1196 helpmod_queue_handler(sender
, returntype
, hchan
, HQ_ON
, ostr
, argc
, argv
);
1199 static void helpmod_cmd_dequeue (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1203 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1204 helpmod_queue_handler(sender
, returntype
, hchan
, HQ_OFF
, ostr
, argc
, argv
);
1207 static void helpmod_cmd_autoqueue (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1211 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1212 helpmod_queue_handler(sender
, returntype
, hchan
, HQ_MAINTAIN
, ostr
, argc
, argv
);
1215 static void helpmod_cmd_dnmo (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1220 helpmod_reply(sender
, returntype
, "Cannot correct the luser: User not defined");
1223 if (argc
> H_CMD_MAX_ARGS
)
1224 argc
= H_CMD_MAX_ARGS
;
1225 for (i
=0;i
<argc
;i
++)
1227 huser
*husr
= huser_get(getnickbynick(argv
[i
]));
1230 helpmod_reply(sender
, returntype
, "Cannot correct the luser: User %s not found", argv
[i
]);
1233 if (huser_get_level(husr
) > H_PEON
)
1235 helpmod_reply(sender
, returntype
, "Cannot correct the luser: User %s is not a peon", argv
[i
]);
1239 if (!hchannels_on_queue(husr) && !hchannels_on_desk(husr))
1241 helpmod_reply(sender, returntype, "Cannot correct the luser: User %s is not in any queue", argv[i]);
1245 hchannels_dnmo(husr
);
1247 helpmod_reply(husr
, NULL
, "You contacted a channel operator without permission. This is a violation of the channel rules. As a result you have been set to the last queue position");
1248 helpmod_reply(sender
, returntype
, "User %s has been informed of his mistake", argv
[i
]);
1250 { /* fix the autoqueue for the channel(s) */
1252 for (hchan
= hchannels
;hchan
;hchan
= hchan
->next
)
1253 hqueue_handle_queue(hchan
, sender
);
1257 static void helpmod_cmd_ban (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1259 if (argc
== 0 || !ci_strcmp(argv
[0], "list"))
1270 helpmod_reply(sender
, returntype
, "Global bans matching pattern %s", pattern
);
1272 for (;ptr
;ptr
= ptr
->next
)
1273 if (strregexp(bantostring(ptr
->real_ban
), pattern
))
1275 helpmod_reply(sender
, returntype
, "%-64s %-20s %s", bantostring(ptr
->real_ban
), helpmod_strtime(ptr
->expiration
- time(NULL
)), ptr
->reason
?ptr
->reason
->content
:"");
1279 helpmod_reply(sender
, returntype
, "%d Global bans match pattern %s", count
, pattern
);
1281 else if (!ci_strcmp(argv
[0], "add"))
1283 int duration
= 4 * HDEF_h
;
1284 char *reason
= "Banned";
1285 char *target
= argv
[1];
1289 helpmod_reply(sender
, returntype
, "Cannot add global ban: Target hostmask not defined");
1294 if ((duration
= helpmod_read_strtime(argv
[2])) < 0)
1296 helpmod_reply(sender
, returntype
, "Cannot add global ban: Invalid time %s", argv
[2]);
1308 hban_add(target
, reason
, time(NULL
) + duration
, 0);
1309 helpmod_reply(sender
, returntype
, "Added ban for %s (%s), expires in %s", target
, reason
, helpmod_strtime(duration
));
1311 else if (!ci_strcmp(argv
[0], "del"))
1316 helpmod_reply(sender
, returntype
, "Cannot remove global ban: Target hostmask not defined");
1319 if (argc
> H_CMD_MAX_ARGS
)
1320 argc
= H_CMD_MAX_ARGS
;
1321 for (i
=1;i
<argc
;i
++)
1323 hban
*ptr
= hban_get(argv
[i
]);
1326 helpmod_reply(sender
, returntype
, "Cannot remove global ban: Hostmask %s is not banned", argv
[i
]);
1329 helpmod_reply(sender
, returntype
, "Global ban for hostmask %s removed", argv
[i
]);
1335 helpmod_reply(sender
, returntype
, "Cannot handle global bans: Unknown operation %s", argv
[0]);
1340 static void helpmod_cmd_chanban (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1349 helpmod_reply(sender
, returntype
, "Cannot handle channel bans: Channel not defined or not found");
1353 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1357 helpmod_reply(sender, returntype, "Cannot handle channel bans: Operation not defined");
1361 if (argc
== 0 || !ci_strcmp(argv
[0], "list"))
1363 char *pattern
, *cban
;
1364 chanban
*ptr
= hchan
->real_channel
->bans
;
1372 helpmod_reply(sender
, returntype
, "Bans matching pattern %s for channel %s", pattern
, hchannel_get_name(hchan
));
1373 for (;ptr
;ptr
= ptr
->next
)
1374 if (strregexp((cban
= bantostring(ptr
)), pattern
))
1377 if (hchanban_get(hchan
,cban
) != NULL
)
1378 helpmod_reply(sender
, returntype
, "%s Expires in %s", bantostring(ptr
), helpmod_strtime(hchanban_get(hchan
, cban
)->expiration
- time(NULL
)));
1380 helpmod_reply(sender
, returntype
, "%s", bantostring(ptr
));
1382 helpmod_reply(sender
, returntype
, "%d bans match pattern %s on channel %s", count
, pattern
, hchannel_get_name(hchan
));
1384 else if (!ci_strcmp(argv
[0], "add"))
1388 helpmod_reply(sender
, returntype
, "Cannot add channel bans: Pattern not defined");
1391 if (argc
> H_CMD_MAX_ARGS
)
1392 argc
= H_CMD_MAX_ARGS
;
1393 for (i
=1;i
<argc
;i
++)
1395 /* POSSIBLE BUG ? */
1396 helpmod_setban(hchan
, argv
[i
], H_ETERNITY
, MCB_ADD
, HLAZY
);
1397 helpmod_reply(sender
, returntype
, "Added ban %s to channel %s", argv
[i
], hchannel_get_name(hchan
));
1400 else if (!ci_strcmp(argv
[0], "del"))
1404 helpmod_reply(sender
, returntype
, "Cannot remove channel bans: Pattern not defined");
1407 if (argc
> H_CMD_MAX_ARGS
)
1408 argc
= H_CMD_MAX_ARGS
;
1409 for (i
=1;i
<argc
;i
++)
1411 chanban
*ptr
= hchan
->real_channel
->bans
;
1412 for (;ptr
;ptr
= ptr
->next
)
1413 if (strregexp(bantostring(ptr
), argv
[i
]))
1415 helpmod_setban(hchan
, argv
[i
], 0, MCB_DEL
, HLAZY
);
1416 helpmod_reply(sender
, returntype
, "Channel ban %s removed from channel %s", argv
[i
], hchannel_get_name(hchan
));
1420 helpmod_reply(sender
, returntype
, "Cannot remove channel ban: Pattern %s not banned on channel %s", argv
[i
], hchannel_get_name(hchan
));
1425 helpmod_reply(sender
, returntype
, "Cannot handle channel bans: Unknown operation %s", argv
[0]);
1430 static void helpmod_cmd_idlekick (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1437 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1441 helpmod_reply(sender
, returntype
, "Cannot handle the idlekick: Channel not defined or not found");
1444 if (argc
== 0) /* view */
1446 helpmod_reply(sender
, returntype
, "Idlekick for channel %s is set to %s", hchannel_get_name(hchan
), helpmod_strtime(hchan
->max_idle
));
1449 else if ((tmp
= helpmod_read_strtime(argv
[0])) < 0 || tmp
< HDEF_m
|| tmp
> HDEF_w
)
1451 helpmod_reply(sender
, returntype
, "Cannot set the idlekick: Invalid time given '%s'", argv
[0]);
1456 hchan
->max_idle
= tmp
;
1457 helpmod_reply(sender
, returntype
, "Idlekick for channel %s set to %s succesfully", hchannel_get_name(hchan
), helpmod_strtime(hchan
->max_idle
));
1461 static void helpmod_cmd_topic (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1466 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1470 helpmod_reply(sender
, returntype
, "Cannot handle the topic: Channel not defined or not found");
1473 if (!(hchan
-> flags
& H_HANDLE_TOPIC
))
1474 helpmod_reply(sender
, returntype
, "Note: I'm not set to handle the topic on channel %s", hchannel_get_name(hchan
));
1476 if (argc
== 0) /* check the topic */
1478 helpmod_reply(sender
, returntype
, "Topic of channel %s is currently: %s", hchannel_get_name(hchan
), htopic_construct(hchan
->topic
));
1481 if (!ci_strcmp(argv
[0], "erase"))
1483 htopic_del_all(&hchan
->topic
);
1484 hchannel_set_topic(hchan
);
1485 helpmod_reply(sender
, returntype
, "Topic of channel %s erased", hchannel_get_name(hchan
));
1487 else if (!ci_strcmp(argv
[0], "refresh"))
1489 hchannel_set_topic(hchan
);
1490 helpmod_reply(sender
, returntype
, "Topic of channel %s refreshed", hchannel_get_name(hchan
));
1492 else if (!ci_strcmp(argv
[0], "add"))
1498 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Additional arguments required", hchannel_get_name(hchan
));
1501 if (sscanf(argv
[0], "%d", &pos
) && pos
>= 0)
1507 if (argc
== 0) /* lame repeat :( */
1509 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Additional arguments required", hchannel_get_name(hchan
));
1512 if (htopic_len(hchan
->topic
) + strlen(ostr
) + 3 > TOPICLEN
)
1514 helpmod_reply(sender
, returntype
, "Cannot add to the topic of channel %s: Maximum topic length exceeded", hchannel_get_name(hchan
));
1518 htopic_add(&hchan
->topic
, ostr
, pos
);
1519 hchannel_set_topic(hchan
);
1520 helpmod_reply(sender
, returntype
, "Added '%s' to the topic of channel %s", ostr
, hchannel_get_name(hchan
));
1522 else if (!ci_strcmp(argv
[0], "del"))
1527 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Additional arguments required", hchannel_get_name(hchan
));
1531 if (!sscanf(argv
[0], "%d", &pos
) || pos
< 0)
1533 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Expected positive integer", hchannel_get_name(hchan
));
1536 if (htopic_count(hchan
->topic
) < pos
)
1538 helpmod_reply(sender
, returntype
, "Cannot delete from the topic of channel %s: No such topic element %d", hchannel_get_name(hchan
), pos
);
1541 htopic_del(&hchan
->topic
, htopic_get(hchan
->topic
, pos
));
1542 hchannel_set_topic(hchan
);
1544 else if (!ci_strcmp(argv
[0], "set"))
1548 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Additional arguments required", hchannel_get_name(hchan
));
1552 htopic_del_all(&hchan
->topic
);
1553 htopic_add(&hchan
->topic
, ostr
, 0);
1554 hchannel_set_topic(hchan
);
1557 helpmod_reply(sender
, returntype
, "Cannot handle the topic of channel %s: Unknown operation %s", hchannel_get_name(hchan
), argv
[0]);
1560 static void helpmod_cmd_out (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1564 char *reason
= "Banned";
1565 huser
*targets
[H_CMD_MAX_ARGS
];
1570 helpmod_reply(sender
, returntype
, "Cannot get rid of the user: User not specified");
1574 if (argc
> H_CMD_MAX_ARGS
)
1575 argc
= H_CMD_MAX_ARGS
;
1576 for (i
=0;i
<argc
;i
++)
1578 if (argv
[i
][0] == ':')
1582 helpmod_reply(sender
, returntype
, "Cannot get rid of users: No users specified");
1591 if (!strncmp(reason
, "?? ", 3))
1592 { /* obtain reason from hterms */
1593 hchannel
*hchan
= NULL
;
1595 if (returntype
!= NULL
)
1596 { /* if hchan is NULL here then everything is broken already */
1597 hchan
= hchannel_get_by_channel(returntype
);
1598 new_reason
= hterm_get_and_find(hchan
->channel_hterms
, reason
+ 3);
1601 new_reason
= hterm_get_and_find(hterms
, reason
+ 3);
1603 if (new_reason
!= NULL
)
1604 reason
= new_reason
->description
->content
;
1609 husr
= huser_get(getnickbynick(argv
[i
]));
1612 helpmod_reply(sender
, returntype
, "Cannot get rid of the user: User %s not found", argv
[i
]);
1615 if (huser_get_level(husr
) > H_PEON
)
1617 helpmod_reply(sender
, returntype
, "Cannot get rid of the user: User %s is not a peon", huser_get_nick(husr
));
1620 targets
[ntargets
++] = husr
;
1623 for (i
=0;i
<ntargets
;i
++)
1625 const char *banmask
= hban_ban_string(targets
[i
]->real_user
, HBAN_HOST
);
1627 hban_add(banmask
, reason
, time(NULL
) + HCMD_OUT_DEFAULT
, HLAZY
);
1629 helpmod_reply(sender
, returntype
, "User %s is now gone", huser_get_nick(targets
[i
]));
1634 static void helpmod_cmd_everyoneout (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1637 hchannel_user
**hchanuser
;
1638 char *reason
= "clearing channel";
1639 int autoqueue_tmp
= -1;
1642 HELPMOD_KICKMODE_ALL
,
1643 HELPMOD_KICKMODE_UNAUTHED
1644 } kickmode
= HELPMOD_KICKMODE_ALL
;
1648 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1652 helpmod_reply(sender
, returntype
, "Cannot clear channel: Channel not defined or not found");
1658 if (!ci_strcmp(argv
[0], "all"))
1660 kickmode
= HELPMOD_KICKMODE_ALL
;
1663 else if (!ci_strcmp(argv
[0], "unauthed"))
1665 kickmode
= HELPMOD_KICKMODE_UNAUTHED
;
1673 hchan
->flags
|= H_MAINTAIN_I
;
1674 hchannel_mode_check(hchan
);
1676 hchanuser
= &hchan
->channel_users
;
1678 if ((hchan
->flags
& H_QUEUE
) && (hchan
->flags
& H_QUEUE_MAINTAIN
))
1680 autoqueue_tmp
= hchan
->autoqueue
;
1681 hchan
->autoqueue
= 0;
1686 if (huser_get_level((*hchanuser
)->husr
) < H_TRIAL
)
1687 if (kickmode
== HELPMOD_KICKMODE_ALL
|| (kickmode
== HELPMOD_KICKMODE_UNAUTHED
&& !IsAccount((*hchanuser
)->husr
->real_user
)))
1689 helpmod_kick(hchan
, (*hchanuser
)->husr
, "%s", reason
);
1692 hchanuser
= &(*hchanuser
)->next
;
1695 if (autoqueue_tmp
> 0)
1696 hchan
->autoqueue
= autoqueue_tmp
;
1698 helpmod_reply(sender
, returntype
, "Channel %s has been cleared of normal users", hchannel_get_name(hchan
));
1701 static void helpmod_cmd_kick (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1705 huser
*husr
, *targets
[H_CMD_MAX_ARGS
];
1707 char *reason
= "out";
1710 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1714 helpmod_reply(sender
, returntype
, "Cannot kick the user: Channel not defined or not found");
1720 helpmod_reply(sender
, returntype
, "Cannot kick users: No users specified");
1724 if (argc
> H_CMD_MAX_ARGS
)
1725 argc
= H_CMD_MAX_ARGS
;
1726 for (i
=0;i
<argc
;i
++)
1728 if (*argv
[i
] == ':')
1732 helpmod_reply(sender
, returntype
, "Cannot kick the user: No users defined");
1742 husr
= huser_get(getnickbynick(argv
[i
]));
1745 helpmod_reply(sender
, returntype
, "Cannot kick the user: User %s not found", argv
[i
]);
1748 if (huser_on_channel(husr
, hchan
) == NULL
)
1750 helpmod_reply(sender
, returntype
, "Cannot kick the user: User %s is not on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
1753 if (huser_get_level(husr
) > H_PEON
)
1755 helpmod_reply(sender
, returntype
, "Cannot kick the user: User %s is not a peon", huser_get_nick(husr
));
1758 targets
[ntargets
++] = husr
;
1761 for (i
=0;i
<ntargets
;i
++)
1762 helpmod_kick(hchan
, targets
[i
], "%s", reason
);
1765 static void helpmod_cmd_stats (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1768 haccount
*target
= sender
->account
;
1770 hstat_account_entry
*stat_entry
;
1771 int days
= 1, weeks
= 0;
1772 int type
= HSTAT_ACCOUNT_SHORT
;
1774 time_t timer
= time(NULL
);
1775 struct tm
*tstruct
= localtime(&timer
);
1781 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1785 helpmod_reply(sender
, returntype
, "Cannot show user statistics: Channel not defined or not found");
1789 if (argc
> 0 && huser_get_level(sender
) == H_ADMIN
)
1790 { /* not very elegant */
1791 if (argv
[0][0] == '#') /* account */
1793 target
= haccount_get_by_name(argv
[0]+1);
1796 helpmod_reply(sender
, returntype
, "Cannot show user statistics: Account %s not found", argv
[0]);
1805 helpmod_reply(sender
, returntype
, "Cannot show user statistics: You do not have an account");
1811 if (!ci_strcmp(argv
[0], "short") || !ci_strcmp(argv
[0], "s"))
1813 type
= HSTAT_ACCOUNT_SHORT
;
1816 else if (!ci_strcmp(argv
[0], "long") || !ci_strcmp(argv
[0], "l"))
1818 type
= HSTAT_ACCOUNT_LONG
;
1824 if (sscanf(argv
[0], "%d", &days
))
1826 if (days
< 0 || days
> 7)
1828 helpmod_reply(sender
, returntype
, "Cannot show user statistics: Expected integer between [0, 7]");
1838 if (sscanf(argv
[0], "%d", &weeks
))
1840 if (weeks
< 0 || weeks
> 10)
1842 helpmod_reply(sender
, returntype
, "Cannot show user statistics: Expected integer between [0, 10]");
1851 for (ptr
= target
->stats
;ptr
;ptr
= ptr
->next
)
1852 if (ptr
->hchan
== hchan
)
1857 helpmod_reply(sender
, returntype
, "Cannot show user statistics: User %s has no statistics for channel %s", target
->name
->content
, hchannel_get_name(hchan
));
1861 if (!days
&& !weeks
)
1864 helpmod_reply(sender
, returntype
, "Statistics for user %s on channel %s", target
->name
->content
, hchannel_get_name(hchan
));
1868 helpmod_reply(sender
, returntype
, "Last %d day%s", days
, (days
==1)?"":"s");
1869 helpmod_reply(sender
, returntype
, "%s", hstat_header(type
));
1870 for (i
=0;i
<days
;i
++)
1872 stat_entry
= &ptr
->week
[(tstruct
->tm_wday
- i
+ 7) % 7];
1873 helpmod_reply(sender
, returntype
, "%s", hstat_account_print(stat_entry
, type
));
1879 helpmod_reply(sender
, returntype
, "Last %d week%s", weeks
, (weeks
==1)?"":"s");
1880 helpmod_reply(sender
, returntype
, "%s", hstat_header(type
));
1881 for (i
=0;i
<weeks
;i
++)
1883 stat_entry
= &ptr
->longterm
[(hstat_week() - i
+ 10) % 10];
1884 helpmod_reply(sender
, returntype
, "%s", hstat_account_print(stat_entry
, type
));
1889 static void helpmod_cmd_chanstats (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1892 hstat_channel
*channel_stats
;
1893 hstat_channel_entry
*stat_entry
;
1895 time_t timer
= time(NULL
);
1896 struct tm
*tstruct
= localtime(&timer
);
1899 int type
= HSTAT_CHANNEL_SHORT
;
1906 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
1910 helpmod_reply(sender
, returntype
, "Cannot show channel statistics: Channel not defined or not found");
1916 if (!ci_strcmp(argv
[0], "short") || !ci_strcmp(argv
[0], "s"))
1918 type
= HSTAT_CHANNEL_SHORT
;
1921 else if (!ci_strcmp(argv
[0], "long") || !ci_strcmp(argv
[0], "l"))
1923 type
= HSTAT_CHANNEL_LONG
;
1929 if (sscanf(argv
[0], "%d", &days
))
1931 if (days
< 0 || days
> 7)
1933 helpmod_reply(sender
, returntype
, "Cannot show channel statistics: Expected integer between [0, 7]");
1943 if (sscanf(argv
[0], "%d", &weeks
))
1945 if (weeks
< 0 || weeks
> 10)
1947 helpmod_reply(sender
, returntype
, "Cannot show channel statistics: Expected integer between [0, 10]");
1956 channel_stats
= hchan
->stats
;
1958 if (!days
&& !weeks
)
1961 helpmod_reply(sender
, returntype
, "Statistics for channel %s", hchannel_get_name(hchan
));
1965 helpmod_reply(sender
, returntype
, "Last %d day%s", days
, (days
==1)?"":"s");
1966 helpmod_reply(sender
, returntype
, "%s", hstat_header(type
));
1967 for (i
=0;i
<days
;i
++) /* latest week */
1969 stat_entry
= &hchan
->stats
->week
[(tstruct
->tm_wday
- i
+ 7) % 7];
1970 helpmod_reply(sender
, returntype
, "%s", hstat_channel_print(stat_entry
, type
));
1976 helpmod_reply(sender
, returntype
, "Last %d week%s", weeks
, (weeks
==1)?"":"s");
1977 helpmod_reply(sender
, returntype
, "%s", hstat_header(type
));
1978 for (i
=0;i
<weeks
;i
++) /* latest weeks */
1980 stat_entry
= &hchan
->stats
->longterm
[(hstat_week() - i
+ 10) % 10];
1981 helpmod_reply(sender
, returntype
, "%s", hstat_channel_print(stat_entry
, type
));
1986 static void helpmod_cmd_activestaff (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
1989 hstat_accounts_array arr
;
1990 hlevel lvl
= H_OPER
;
1998 helpmod_reply(sender
, returntype
, "Cannot list active staff: Channel not specified or not found");
2004 if (!ci_strcmp(argv
[0], "opers") || !ci_strcmp(argv
[0], "o"))
2009 else if (!ci_strcmp(argv
[0], "staff") || !ci_strcmp(argv
[0], "s"))
2014 else if (!ci_strcmp(argv
[0], "staff") || !ci_strcmp(argv
[0], "s"))
2023 if (!ci_strcmp(argv
[0], "active") || !ci_strcmp(argv
[0], "a"))
2028 else if (!ci_strcmp(argv
[0], "inactive") || !ci_strcmp(argv
[0], "i"))
2035 arr
= create_hstat_account_array(hchan
, lvl
, HSTAT_ACCOUNT_ARRAY_TOP10
);
2037 helpmod_reply(sender
, returntype
, "%s %ss for channel %s", listtype
?"Inactive":"Active", hlevel_name(lvl
), hchannel_get_name(hchan
));
2041 for (i
=0;i
< arr
.arrlen
;i
++)
2042 if (arr
.array
[i
].prime_time_spent
> H_ACTIVE_LIMIT
)
2043 helpmod_reply(sender
, returntype
, "#%-2d %-20s %-20s %-20s", i
+1,((haccount
*)(arr
.array
[i
].owner
))->name
->content
, helpmod_strtime(arr
.array
[i
].prime_time_spent
), helpmod_strtime(arr
.array
[i
].time_spent
));
2046 for (i
=arr
.arrlen
-1;i
>= 0;i
--)
2047 if (arr
.array
[i
].prime_time_spent
< H_ACTIVE_LIMIT
)
2048 helpmod_reply(sender
, returntype
, "#%-2d %-20s %-20s %-20s", (arr
.arrlen
- i
),((haccount
*)(arr
.array
[i
].owner
))->name
->content
, helpmod_strtime(arr
.array
[i
].prime_time_spent
), helpmod_strtime(arr
.array
[i
].time_spent
));
2055 static void helpmod_cmd_top10 (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2058 hstat_accounts_array arr
;
2059 hlevel lvl
= H_OPER
;
2064 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2068 helpmod_reply(sender
, returntype
, "Cannot list channel Top10: Channel not specified or not found");
2074 if (!ci_strcmp(argv
[0], "opers") || !ci_strcmp(argv
[0], "o"))
2076 else if (!ci_strcmp(argv
[0], "staff") || !ci_strcmp(argv
[0], "s"))
2078 else if (!ci_strcmp(argv
[0], "all") || !ci_strcmp(argv
[0], "a"))
2084 if (sscanf(argv
[1], "%d", &tmp
) && (tmp
>= 10) && (tmp
<= 50))
2088 arr
= create_hstat_account_array(hchan
, lvl
, HSTAT_ACCOUNT_ARRAY_TOP10
);
2090 helpmod_reply(sender
, returntype
, "Top%d most active %ss of channel %s", top_n
, hlevel_name(lvl
), hchannel_get_name(hchan
));
2091 for (i
=0;i
< arr
.arrlen
&& i
< top_n
;i
++)
2092 helpmod_reply(sender
, returntype
, "#%-2d %-20s %-20s %-20s",i
+1,((haccount
*)(arr
.array
[i
].owner
))->name
->content
, helpmod_strtime(arr
.array
[i
].prime_time_spent
), helpmod_strtime(arr
.array
[i
].time_spent
));
2097 static void helpmod_cmd_report (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2099 hchannel
*hchan
, *target
;
2102 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2104 if (hchan
!= NULL
&& (argc
== 2))
2106 hchan
= hchannel_get_by_name(argv
[0]);
2112 helpmod_reply(sender
, returntype
, "Cannot view or set channel reporting: Channel not defined or not found");
2117 if (hchan
->report_to
== NULL
|| !hchannel_is_valid(hchan
->report_to
))
2118 helpmod_reply(sender
, returntype
, "Channel %s is not reported anywhere (%s)", hchannel_get_name(hchan
), hchannel_get_state(hchan
, H_REPORT
));
2120 helpmod_reply(sender
, returntype
, "Channel %s is reported to channel %s (%s)", hchannel_get_name(hchan
), hchannel_get_name(hchan
->report_to
), hchannel_get_state(hchan
, H_REPORT
));
2123 if ((target
= hchannel_get_by_name(argv
[0])) == NULL
)
2125 helpmod_reply(sender
, returntype
, "Cannot set channel reporting: Channel %s not found", argv
[0]);
2128 hchan
->report_to
= target
;
2129 helpmod_reply(sender
, returntype
, "Channel %s is now reported to channel %s (%s)", hchannel_get_name(hchan
), hchannel_get_name(hchan
->report_to
), hchannel_get_state(hchan
, H_REPORT
));
2132 static void helpmod_cmd_mode(huser
*sender
, channel
* returntype
, int change
, char* ostr
, int argc
, char *argv
[])
2135 huser_channel
*huserchan
;
2141 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2145 helpmod_reply(sender
, returntype
, "Cannot change mode: Channel not specified or not found");
2149 if (argc
==0) /* for a simple opme */
2152 argv
[0] = (char*)huser_get_nick(sender
);
2155 if (argc
> H_CMD_MAX_ARGS
)
2156 argc
= H_CMD_MAX_ARGS
;
2158 for (i
=0;i
<argc
;i
++)
2160 husr
= huser_get(getnickbynick(argv
[i
]));
2163 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s not found", argv
[i
]);
2166 huserchan
= huser_on_channel(husr
, hchan
);
2167 if (huserchan
== NULL
)
2169 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s it not on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2178 for (j
=0;j
< hchan
->real_channel
->users
->hashsize
;j
++)
2179 if (getnickbynumeric(hchan
->real_channel
->users
->content
[j
]) == husr
->real_user
)
2181 if ((huserchan
->flags
& HCUMODE_OP
) && !(hchan
->real_channel
->users
->content
[j
] & CUMODE_OP
))
2183 huserchan
->flags
&= ~HCUMODE_OP
;
2184 Error("helpmod", ERR_ERROR
, "userchannelmode inconsistency (+o when should be -o)");
2186 if (huserchan
->flags
& HCUMODE_OP
)
2188 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is already +o on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2191 if (huser_get_level(husr
) < H_STAFF
)
2193 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is not allowed to have +o on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2196 helpmod_channick_modes(husr
, hchan
, MC_OP
, HLAZY
);
2202 for (j
=0;j
< hchan
->real_channel
->users
->hashsize
;j
++)
2203 if (getnickbynumeric(hchan
->real_channel
->users
->content
[j
]) == husr
->real_user
)
2205 if (!(huserchan
->flags
& HCUMODE_OP
) && (hchan
->real_channel
->users
->content
[j
] & CUMODE_OP
))
2207 huserchan
->flags
|= HCUMODE_OP
;
2208 Error("helpmod", ERR_ERROR
, "userchannelmode inconsistency (-o when should be +o)");
2210 if (!(huserchan
->flags
& HCUMODE_OP
))
2212 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is already -o on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2215 if (huser_get_level(husr
) > huser_get_level(sender
))
2217 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is meant to have +o on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2220 helpmod_channick_modes(husr
, hchan
, MC_DEOP
, HLAZY
);
2226 for (j
=0;j
< hchan
->real_channel
->users
->hashsize
;j
++)
2227 if (getnickbynumeric(hchan
->real_channel
->users
->content
[j
]) == husr
->real_user
)
2229 if ((huserchan
->flags
& HCUMODE_VOICE
) && !(hchan
->real_channel
->users
->content
[j
] & CUMODE_VOICE
))
2231 huserchan
->flags
&= ~HCUMODE_VOICE
;
2232 Error("helpmod", ERR_ERROR
, "userchannelmode inconsistency (+v when should be -v)");
2234 if (huserchan
->flags
& HCUMODE_VOICE
)
2236 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is already +v on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2239 helpmod_channick_modes(husr
, hchan
, MC_VOICE
, HLAZY
);
2245 for (j
=0;j
< hchan
->real_channel
->users
->hashsize
;j
++)
2246 if (getnickbynumeric(hchan
->real_channel
->users
->content
[j
]) == husr
->real_user
)
2248 if (!(huserchan
->flags
& HCUMODE_VOICE
) && (hchan
->real_channel
->users
->content
[j
] & CUMODE_VOICE
))
2250 huserchan
->flags
|= HCUMODE_VOICE
;
2251 Error("helpmod", ERR_ERROR
, "userchannelmode inconsistency (-v when should be +v)");
2253 if (!(huserchan
->flags
& HCUMODE_VOICE
))
2255 helpmod_reply(sender
, returntype
, "Cannot change mode: User %s is already -v on channel %s", huser_get_nick(husr
), hchannel_get_name(hchan
));
2258 helpmod_channick_modes(husr
, hchan
, MC_DEVOICE
, HLAZY
);
2265 static void helpmod_cmd_op (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_mode(sender
, returntype
, H_CMD_OP
, ostr
, argc
, argv
); }
2266 static void helpmod_cmd_deop (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_mode(sender
, returntype
, H_CMD_DEOP
, ostr
, argc
, argv
); }
2267 static void helpmod_cmd_voice (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_mode(sender
, returntype
, H_CMD_VOICE
, ostr
, argc
, argv
); }
2268 static void helpmod_cmd_devoice (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[]) { helpmod_cmd_mode(sender
, returntype
, H_CMD_DEVOICE
, ostr
, argc
, argv
); }
2270 static void helpmod_cmd_invite (huser
*sender
, channel
*returntype
, char* arg
, int argc
, char *argv
[])
2277 helpmod_reply(sender
, returntype
, "Cannot invite: Channel not defined or not found");
2281 if (huser_get_level(sender
) < H_STAFF
)
2284 hchan
= hchannel_get_by_name(argv
[0]);
2287 helpmod_reply(sender
, returntype
, "Cannot invite: Unknown channel %s", argv
[0]);
2290 /* if tickets don't work, it's better that the user doesn't know that the channel really exists */
2291 if (!(hchan
->flags
& H_REQUIRE_TICKET
))
2293 helpmod_reply(sender
, returntype
, "Cannot invite: Unknown channel %s", argv
[0]);
2296 htick
= hticket_get(huser_get_auth(sender
), hchan
);
2300 helpmod_reply(sender
, returntype
, "Cannot invite: You do not have an invite ticket for channel %s", argv
[0]);
2304 if (nickbanned(sender
->real_user
, hchan
->real_channel
, 0))
2306 helpmod_reply(sender
, returntype
, "Cannot invite: You are banned from channel %s", argv
[0]);
2310 helpmod_invite(hchan
, sender
);
2311 helpmod_reply(sender
, returntype
, "Invited you to channel %s", hchannel_get_name(hchan
));
2315 if (argc
> H_CMD_MAX_ARGS
)
2316 argc
= H_CMD_MAX_ARGS
;
2318 for (i
= 0;i
< argc
; i
++)
2320 hchan
= hchannel_get_by_name(argv
[i
]);
2323 helpmod_reply(sender
, returntype
, "Cannot invite: Unknown channel %s", argv
[i
]);
2326 if (huser_on_channel(sender
, hchan
) != NULL
)
2328 helpmod_reply(sender
, returntype
, "Cannot invite: You are already on channel %s", hchannel_get_name(hchan
));
2331 if (!hchannel_authority(hchan
, sender
))
2333 if (huser_get_level(sender
) >= H_STAFF
&& (hchan
->flags
& H_REQUIRE_TICKET
));
2336 helpmod_reply(sender
, returntype
, "Sorry, channel %s is oper only", hchannel_get_name(hchan
));
2340 helpmod_invite(hchan
, sender
);
2341 helpmod_reply(sender
, returntype
, "Invited you to channel %s", hchannel_get_name(hchan
));
2345 static void helpmod_cmd_ticket (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2347 int expiration
= HTICKET_EXPIRATION_TIME
;
2351 const char *message
= NULL
;
2355 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: Channel not specified");
2359 hchan
= hchannel_get_by_name(argv
[0]);
2362 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: Unknown channel %s", argv
[0]);
2365 if (!(hchan
->flags
& H_REQUIRE_TICKET
))
2367 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: Tickets are not enabled for channel %s", argv
[0]);
2372 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: Target user not specified");
2376 husr
= huser_get(getnickbynick(argv
[1]));
2379 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: Unknown user %s", argv
[1]);
2382 if (!IsAccount(husr
->real_user
))
2384 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: User %s is not authed", argv
[1]);
2387 if (huser_get_level(husr
) < H_PEON
)
2389 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: User %s is considered improper and not worthy of a ticket", argv
[1]);
2392 if (huser_get_level(husr
) > H_PEON
)
2394 helpmod_reply(sender
, returntype
, "Cannot issue a ticket: User %s does not require a ticket", argv
[1]);
2400 tmp
= helpmod_read_strtime(argv
[2]);
2401 if (tmp
> HDEF_m
&& tmp
< 2 * HDEF_M
)
2404 if (argc
>= 4 && strlen(argv
[3]) < 128)
2406 if (argv
[3][0] != '\0')
2410 htick
= hticket_get(huser_get_auth(husr
), hchan
);
2413 htick
->time_expiration
= time(NULL
) + expiration
;
2415 hticket_add(huser_get_auth(husr
), time(NULL
) + expiration
, hchan
, message
);
2417 helpmod_reply(sender
, returntype
, "Issued an invite ticket to user %s for channel %s expiring in %s", huser_get_nick(husr
), hchannel_get_name(hchan
), helpmod_strtime(expiration
));
2418 helpmod_reply(husr
, NULL
, "You have been issued an invite ticket for channel %s. This ticket is valid for a period of %s. You can use my invite command to get to the channel now. Type /msg %s invite %s",hchannel_get_name(hchan
), helpmod_strtime(HTICKET_EXPIRATION_TIME
), helpmodnick
->nick
, hchannel_get_name(hchan
));
2419 if (hchan
->flags
& H_TICKET_MESSAGE
&& hchan
->ticket_message
!= NULL
)
2420 helpmod_reply(husr
, NULL
, "Ticket information for %s: %s", hchannel_get_name(hchan
), hchan
->ticket_message
->content
);
2423 static void helpmod_cmd_resolve (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2432 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2434 if (argc
> H_CMD_MAX_ARGS
)
2435 argc
= H_CMD_MAX_ARGS
;
2439 helpmod_reply(sender
, returntype
, "Cannot resolve a ticket: The channel is not specified");
2443 for (i
= 0;i
< argc
;i
++)
2445 if (argv
[i
][0] == '#')
2447 htick
= hticket_get(&argv
[i
][1], hchan
);
2450 helpmod_reply(sender
, returntype
, "Cannot resolve a ticket: Authname %s does not have a ticket for channel %s", &argv
[i
][1], hchannel_get_name(hchan
));
2453 hticket_del(htick
, hchan
);
2454 helpmod_reply(sender
, returntype
, "Resolved authname %s's ticket for channel %s", &argv
[i
][1], hchannel_get_name(hchan
));
2458 husr
= huser_get(getnickbynick(argv
[i
]));
2461 helpmod_reply(sender
, returntype
, "Cannot resolve a ticket: User %s not found", argv
[i
]);
2464 if (!IsAccount(husr
->real_user
))
2466 helpmod_reply(sender
, returntype
, "Cannot resolve a ticket: User %s is not authed", argv
[i
]);
2469 htick
= hticket_get(huser_get_auth(husr
),hchan
);
2472 helpmod_reply(sender
, returntype
, "Cannot resolve a ticket: User %s does not have a ticket for channel %s", argv
[i
], hchannel_get_name(hchan
));
2475 hticket_del(htick
, hchan
);
2476 helpmod_reply(sender
, returntype
, "Resolved user %s's ticket for channel %s", argv
[i
], hchannel_get_name(hchan
));
2481 static void helpmod_cmd_tickets (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2489 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2493 helpmod_reply(sender
, returntype
, "Cannot list tickets: Channel not defined or not found");
2497 if (!(hchan
->flags
& H_REQUIRE_TICKET
))
2499 helpmod_reply(sender
, returntype
, "Cannot list tickets: Channel %s does not use the ticket system", hchannel_get_name(hchan
));
2503 htick
= hchan
->htickets
;
2507 helpmod_reply(sender
, returntype
, "Channel %s has no valid tickets", hchannel_get_name(hchan
));
2511 helpmod_reply(sender
, returntype
, "Valid tickets for channel %s", hchannel_get_name(hchan
));
2513 for (i
= 0;htick
;htick
= htick
->next
, i
++)
2514 helpmod_reply(sender
, returntype
, "%4d %16s %48s", i
, htick
->authname
, helpmod_strtime(time(NULL
) - htick
->time_expiration
));
2516 helpmod_reply(sender
, returntype
, "Done listing tickets. Channel %s had %d valid ticket%s", hchannel_get_name(hchan
), i
, (i
==1)?"":"s");
2519 static void helpmod_cmd_showticket (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2528 if (argc
> H_CMD_MAX_ARGS
)
2529 argc
= H_CMD_MAX_ARGS
;
2533 helpmod_reply(sender
, returntype
, "Cannot show the ticket: Channel not defined or not found");
2536 for (i
= 0;i
< argc
;i
++)
2538 husr
= huser_get(getnickbynick(argv
[i
]));
2541 helpmod_reply(sender
, returntype
, "Cannot show the ticket: User %s not found", argv
[i
]);
2544 if (!IsAccount(husr
->real_user
))
2546 helpmod_reply(sender
, returntype
, "Cannot show the ticket: User %s is not authed", argv
[i
]);
2549 htick
= hticket_get(huser_get_auth(husr
), hchan
);
2552 helpmod_reply(sender
, returntype
, "Cannot show the ticket: User %s does not have a valid ticket for channel %s", argv
[i
], hchannel_get_name(hchan
));
2555 if (htick
->message
== NULL
)
2556 helpmod_reply(sender
, returntype
, "User %s has a ticket for channel %s expiring in %s. No message is attached.", argv
[i
], hchannel_get_name(hchan
), helpmod_strtime(htick
->time_expiration
- time(NULL
)));
2558 helpmod_reply(sender
, returntype
, "User %s has a ticket for channel %s expiring in %s. With message: %s", argv
[i
], hchannel_get_name(hchan
), helpmod_strtime(htick
->time_expiration
- time(NULL
)), htick
->message
->content
);
2562 static int helpmod_cmd_termstats_sort(const void *left
, const void *right
)
2564 return (*((hterm
**)right
))->usage
- (*((hterm
**)left
))->usage
;
2567 static void helpmod_cmd_termstats(huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2569 hterm
**arr
, *origin
;
2575 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2580 origin
= hchan
->channel_hterms
;
2582 count
= hterm_count(origin
);
2586 helpmod_reply(sender
, returntype
, "Cannot list term usage statistics: No terms available");
2590 arr
= malloc(sizeof(hterm
*) * count
);
2591 assert(arr
!= NULL
);
2593 for (i
=0;i
< count
;i
++,origin
= origin
->next
)
2596 qsort(arr
, count
, sizeof(hterm
*), helpmod_cmd_termstats_sort
);
2599 helpmod_reply(sender
, returntype
, "10 Most used global terms");
2601 helpmod_reply(sender
, returntype
, "10 Most used terms for channel %s", hchannel_get_name(hchan
));
2603 for (i
=0;i
< 10 && i
< count
;i
++)
2604 helpmod_reply(sender
, returntype
, "#%02d %32s :%d",i
+1, arr
[i
]->name
->content
,arr
[i
]->usage
);
2609 static int helpmod_cmd_checkchannel_nicksort(const void *left
, const void *right
)
2611 return ci_strcmp(getnickbynumeric(*((unsigned long*)left
))->nick
, getnickbynumeric(*((unsigned long*)right
))->nick
);
2614 static int helpmod_cmd_checkchannel_statussort(const void *left
, const void *right
)
2616 int level1
= 0, level2
= 0;
2618 if (*((unsigned long*)left
) & CUMODE_VOICE
)
2620 if (*((unsigned long*)left
) & CUMODE_OP
)
2623 if (*((unsigned long*)right
) & CUMODE_VOICE
)
2625 if (*((unsigned long*)right
) & CUMODE_OP
)
2628 return level2
- level1
;
2631 static void helpmod_cmd_checkchannel(huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2635 int i
, j
, nick_count
= 0, authed_count
= 0, o_limit
= 0, v_limit
= 0, summary_only
= 0;
2636 unsigned long *numeric_array
;
2640 helpmod_reply(sender
, returntype
, "Cannot check channel: Channel not defined");
2644 chan
= findchannel(argv
[0]);
2647 helpmod_reply(sender
, returntype
, "Cannot check channel: Channel %s not found", argv
[0]);
2650 if (argc
> 1 && !ci_strcmp(argv
[1], "summary"))
2653 /* first pass - verify validity and count nicks */
2654 for (i
=0;i
< chan
->users
->hashsize
;i
++)
2656 nck
= getnickbynumeric(chan
->users
->content
[i
]);
2657 if (!nck
) /* it's a hash, not an array */
2665 if (IsOper(nck
) && strlen(nck
->nick
) > 1 && (IsSecret(chan
) || IsPrivate(chan
) || IsKey(chan
) || IsInviteOnly(chan
)))
2667 helpmod_reply(sender
, returntype
, "Cannot check channel: Permission denied. Channel %s has an oper on it and one or more of +i/+k/+p/+s", argv
[0]);
2672 numeric_array
= (unsigned long*)malloc(nick_count
* sizeof(unsigned long));
2674 /* second pass - construct array */
2675 for (i
=0,j
=0;i
< chan
->users
->hashsize
;i
++)
2677 if (getnickbynumeric(chan
->users
->content
[i
]) == NULL
) /* it's a hash, not an array */
2680 numeric_array
[j
++] = chan
->users
->content
[i
];
2683 qsort(numeric_array
, nick_count
, sizeof(unsigned long), helpmod_cmd_checkchannel_statussort
);
2685 /* third pass - find status boundaries */
2687 for (;o_limit
< nick_count
&& numeric_array
[o_limit
] & CUMODE_OP
; o_limit
++);
2689 for(v_limit
= o_limit
; (v_limit
< nick_count
) && numeric_array
[v_limit
] & CUMODE_VOICE
; v_limit
++);
2692 helpmod_reply(sender
, returntype
, "Information on channel %s", argv
[0]);
2693 helpmod_reply(sender
, returntype
, "Channel created %s ago", helpmod_strtime(time(NULL
) - chan
->timestamp
));
2694 if (!IsKey(chan
) && !IsInviteOnly(chan
))
2695 helpmod_reply(sender
, returntype
, "Channel topic: %s", chan
->topic
?chan
->topic
->content
:"Not set");
2696 helpmod_reply(sender
, returntype
, "Channel modes: %s", printflags(chan
->flags
, cmodeflags
));
2699 /* sort the sub arrays */
2702 qsort(numeric_array
, o_limit
, sizeof(unsigned long), helpmod_cmd_checkchannel_nicksort
);
2703 if (v_limit
- o_limit
> 0)
2704 qsort(numeric_array
+ o_limit
, v_limit
- o_limit
, sizeof(unsigned long), helpmod_cmd_checkchannel_nicksort
);
2705 if (nick_count
- v_limit
> 0)
2706 qsort(numeric_array
+ v_limit
, nick_count
- v_limit
, sizeof(unsigned long), helpmod_cmd_checkchannel_nicksort
);
2708 /* fourth pass - print results */
2710 for (i
=0;i
< nick_count
;i
++)
2712 char buf
[256], status
;
2714 if (numeric_array
[i
] & CUMODE_OP
)
2716 else if (numeric_array
[i
] & CUMODE_VOICE
)
2721 visiblehostmask(getnickbynumeric(numeric_array
[i
]), buf
);
2722 if (IsAccount(getnickbynumeric(numeric_array
[i
])))
2723 helpmod_reply(sender
, returntype
, "%c%s (%s)", status
, buf
, getnickbynumeric(numeric_array
[i
])->authname
);
2725 helpmod_reply(sender
, returntype
, "%c%s", status
, buf
);
2728 helpmod_reply(sender
, returntype
, "Users: %d Clones: %d Opped: %d Voiced: %d Authed: %3.0f%%", nick_count
, nick_count
- countuniquehosts(chan
), o_limit
, v_limit
- o_limit
, ((float)authed_count
/ (float)nick_count
) * 100.0);
2730 free(numeric_array
);
2733 static void helpmod_cmd_statsdump (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2735 haccount
*hacc
= haccounts
;
2739 helpmod_reply(sender
, returntype
, "Account statistics");
2740 for (;hacc
;hacc
= hacc
->next
)
2741 for (ptr
= hacc
->stats
;ptr
;ptr
= ptr
->next
)
2743 helpmod_reply(sender
, returntype
, "Account %s channel %s short-term", hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2744 for (i
= 0;i
< 7;i
++)
2745 helpmod_reply(sender
, returntype
, "%d %d %d %d", ptr
->week
[i
].time_spent
, ptr
->week
[i
].prime_time_spent
, ptr
->week
[i
].lines
, ptr
->week
[i
].words
);
2746 helpmod_reply(sender
, returntype
, "Account %s channel %s long-term", hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2747 for (i
= 0;i
< 10;i
++)
2748 helpmod_reply(sender
, returntype
, "%d %d %d %d", ptr
->longterm
[i
].time_spent
, ptr
->longterm
[i
].prime_time_spent
, ptr
->longterm
[i
].lines
, ptr
->longterm
[i
].words
);
2752 static void helpmod_cmd_statsrepair (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2754 haccount
*hacc
= haccounts
;
2758 helpmod_reply(sender
, returntype
, "Repairing account statistics");
2759 for (;hacc
;hacc
= hacc
->next
)
2760 for (ptr
= hacc
->stats
;ptr
;ptr
= ptr
->next
)
2762 for (i
= 0;i
< 7;i
++)
2764 if (ptr
->week
[i
].time_spent
> HDEF_d
)
2766 ptr
->week
[i
].time_spent
= 0;
2767 helpmod_reply(sender
, returntype
, "repaired short term TimeSpent %s @ %s : Greater than one day",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2769 if (ptr
->week
[i
].time_spent
< 0)
2771 ptr
->week
[i
].time_spent
= 0;
2772 helpmod_reply(sender
, returntype
, "repaired short term TimeSpent %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2775 if (ptr
->week
[i
].prime_time_spent
> HDEF_d
)
2777 ptr
->week
[i
].prime_time_spent
= 0;
2778 helpmod_reply(sender
, returntype
, "repaired short term PrimeTimeSpent %s @ %s : Greater than one day",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2780 if (ptr
->week
[i
].prime_time_spent
< 0)
2782 ptr
->week
[i
].prime_time_spent
= 0;
2783 helpmod_reply(sender
, returntype
, "repaired short term PrimeTimeSpent %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2786 if (ptr
->week
[i
].lines
> 10000)
2788 ptr
->week
[i
].lines
= 0;
2789 helpmod_reply(sender
, returntype
, "repaired short term Lines %s @ %s : Greater than 10000",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2791 if (ptr
->week
[i
].lines
< 0)
2793 ptr
->week
[i
].lines
= 0;
2794 helpmod_reply(sender
, returntype
, "repaired short term Lines %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2797 if (ptr
->week
[i
].words
> 50000)
2799 ptr
->week
[i
].words
= 0;
2800 helpmod_reply(sender
, returntype
, "repaired short term Words %s @ %s : Greater than 50000",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2802 if (ptr
->week
[i
].words
< 0)
2804 ptr
->week
[i
].words
= 0;
2805 helpmod_reply(sender
, returntype
, "repaired short term Words %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2808 for (i
= 0;i
< 10;i
++)
2810 if (ptr
->longterm
[i
].time_spent
> HDEF_w
)
2812 ptr
->longterm
[i
].time_spent
= 0;
2813 helpmod_reply(sender
, returntype
, "repaired long term TimeSpent %s @ %s : Greater than one week",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2815 if (ptr
->longterm
[i
].time_spent
< 0)
2817 ptr
->longterm
[i
].time_spent
= 0;
2818 helpmod_reply(sender
, returntype
, "repaired long term TimeSpent %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2821 if (ptr
->longterm
[i
].prime_time_spent
> HDEF_w
)
2823 ptr
->longterm
[i
].prime_time_spent
= 0;
2824 helpmod_reply(sender
, returntype
, "repaired long term PrimeTimeSpent %s @ %s : Greater than one week",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2826 if (ptr
->longterm
[i
].prime_time_spent
< 0)
2828 ptr
->longterm
[i
].prime_time_spent
= 0;
2829 helpmod_reply(sender
, returntype
, "repaired long term PrimeTimeSpent %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2832 if (ptr
->longterm
[i
].lines
> 50000)
2834 ptr
->longterm
[i
].lines
= 0;
2835 helpmod_reply(sender
, returntype
, "repaired long term Lines %s @ %s : Greater than 50000",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2837 if (ptr
->longterm
[i
].lines
< 0)
2839 ptr
->longterm
[i
].lines
= 0;
2840 helpmod_reply(sender
, returntype
, "repaired long term Lines %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2843 if (ptr
->longterm
[i
].words
> 50000)
2845 ptr
->longterm
[i
].words
= 0;
2846 helpmod_reply(sender
, returntype
, "repaired long term Words %s @ %s : Greater than 50000",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2848 if (ptr
->longterm
[i
].words
< 0)
2850 ptr
->longterm
[i
].words
= 0;
2851 helpmod_reply(sender
, returntype
, "repaired long term Words %s @ %s : Less than zero",hacc
->name
->content
, hchannel_get_name(ptr
->hchan
));
2855 helpmod_reply(sender
, returntype
, "Account statistics repaired");
2859 static void helpmod_cmd_statsreset (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2861 haccount
*hacc
= haccounts
;
2864 int i
, short_del
, long_del
;
2868 helpmod_reply(sender
, returntype
, "Insufficient parameters");
2872 if (sscanf(argv
[0], "%d", &short_del
) == 0)
2874 helpmod_reply(sender
, returntype
, "Invalid parameter");
2877 if (sscanf(argv
[1], "%d", &long_del
) == 0)
2879 helpmod_reply(sender
, returntype
, "Invalid parameter");
2883 for (;hacc
;hacc
= hacc
->next
)
2884 for (ptr
= hacc
->stats
;ptr
;ptr
= ptr
->next
)
2886 for (i
= 1;i
< short_del
+ 1;i
++)
2887 HSTAT_ACCOUNT_ZERO(ptr
->week
[(hstat_day() + i
) % 7]);
2888 for (i
= 1;i
< long_del
+ 1;i
++)
2889 HSTAT_ACCOUNT_ZERO(ptr
->longterm
[(hstat_week() + i
) % 10]);
2892 for (hchan
= hchannels
;hchan
;hchan
= hchan
->next
)
2894 for (i
= 1;i
< short_del
+ 1;i
++)
2895 HSTAT_CHANNEL_ZERO(hchan
->stats
->week
[(hstat_day() + i
) % 7]);
2896 for (i
= 1;i
< long_del
+ 1;i
++)
2897 HSTAT_CHANNEL_ZERO(hchan
->stats
->longterm
[(hstat_week() + i
) % 10]);
2901 helpmod_reply(sender
, returntype
, "Statistics reset complete");
2904 static void helpmod_cmd_message (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2910 helpmod_reply(sender
, returntype
, "Cannot send a message: Insufficient arguments");
2913 hchan
= hchannel_get_by_name(argv
[0]);
2916 helpmod_reply(sender
, returntype
, "Cannot send a message: Invalid channel %s", argv
[0]);
2920 helpmod_message_channel(hchan
, "(%s) %s", huser_get_nick(sender
), ostr
);
2921 helpmod_reply(sender
, returntype
, "Message sent to %s", hchannel_get_name(hchan
));
2924 static void helpmod_cmd_version (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2926 helpmod_reply(sender
, returntype
, "HelpMod version " HELPMOD_VERSION
" by strutsi (strutsi@quakenet.org)");
2929 static void helpmod_cmd_ticketmsg (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2935 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
2939 helpmod_reply(sender
, returntype
, "Can not view or set ticket message: No channel is specified.");
2945 if (hchan
->ticket_message
== NULL
)
2946 helpmod_reply(sender
, returntype
, "No ticket message is set for channel %s", hchannel_get_name(hchan
));
2948 helpmod_reply(sender
, returntype
, "Ticket message for channel %s is: %s", hchannel_get_name(hchan
), hchan
->ticket_message
->content
);
2953 if (hchan
->ticket_message
!= NULL
)
2954 freesstring(hchan
->ticket_message
);
2956 hchan
->ticket_message
= getsstring(ostr
, strlen(ostr
));
2957 helpmod_reply(sender
, returntype
, "Ticket message for channel %s set to: %s", hchannel_get_name(hchan
), hchan
->ticket_message
->content
);
2960 static void helpmod_cmd_lcedit (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
2962 hlc_profile
*profile
;
2966 helpmod_reply(sender
, returntype
, "Can not handle lamer control profiles: Operation not defined");
2970 if (!ci_strcmp(argv
[0], "list"))
2972 if (hlc_profiles
== NULL
)
2974 helpmod_reply(sender
, returntype
, "Can not list lamer control profiles: No profiles");
2977 helpmod_reply(sender
, returntype
, "Following lamer control profiles are currently available:");
2978 for (profile
= hlc_profiles
;profile
!= NULL
;profile
= profile
->next
)
2979 helpmod_reply(sender
, returntype
, "%s", profile
->name
->content
);
2981 else if (!ci_strcmp(argv
[0], "add"))
2985 helpmod_reply(sender
, returntype
, "Can not add a lamer control profile: Profile name not defined");
2989 profile
= hlc_get(argv
[1]);
2991 if (profile
!= NULL
)
2993 helpmod_reply(sender
, returntype
, "Can not add a lamer control profile: Profile named %s already exists", argv
[1]);
2996 profile
= hlc_add(argv
[1]);
2998 { /* set the default values */
2999 profile
->caps_max_percentage
= 40;
3000 profile
->caps_min_count
= 20;
3002 profile
->repeats_max_count
= 3;
3003 profile
->repeats_min_length
= 7;
3005 profile
->symbol_repeat_max_count
= 6;
3006 profile
->character_repeat_max_count
= 7;
3007 profile
->symbol_max_count
= 9;
3009 profile
->tolerance_flood
= 5;
3011 profile
->tolerance_spam
= 0.008;
3012 profile
->constant_spam
= 10;
3014 profile
->tolerance_warn
= 1;
3015 profile
->tolerance_kick
= 3;
3016 profile
->tolerance_remove
= 5;
3019 helpmod_reply(sender
, returntype
, "Lamer control profile %s added", argv
[1]);
3021 else if (!ci_strcmp(argv
[0], "del"))
3026 helpmod_reply(sender
, returntype
, "Can not delete a lamer control profile: Profile name not defined");
3030 profile
= hlc_get(argv
[1]);
3032 if (profile
== NULL
)
3034 helpmod_reply(sender
, returntype
, "Can not delete a lamer control profile: Profile named %s does not exist", argv
[1]);
3037 for (hchan
= hchannels
;hchan
!= NULL
;hchan
= hchan
->next
)
3038 if (hchan
->lc_profile
== profile
)
3040 helpmod_reply(sender
, returntype
, "Can not delete a lamer control profile: Profile %s is in use", argv
[1]);
3044 helpmod_reply(sender
, returntype
, "Lamer control profile %s deleted", argv
[1]);
3046 else if (!ci_strcmp(argv
[0], "view"))
3050 helpmod_reply(sender
, returntype
, "Can not view a lamer control profile: Profile name not defined");
3054 profile
= hlc_get(argv
[1]);
3056 if (profile
== NULL
)
3058 helpmod_reply(sender
, returntype
, "Can not view a lamer control profile: Profile named %s not found", argv
[1]);
3062 helpmod_reply(sender
, returntype
, "Lamer control profile %s:", profile
->name
->content
);
3063 helpmod_reply(sender
, returntype
, "Maximum caps percentage: %d", profile
->caps_max_percentage
);
3064 helpmod_reply(sender
, returntype
, "Caps minimum count: %d", profile
->caps_min_count
);
3065 helpmod_reply(sender
, returntype
, "Repeat tolerance: %d", profile
->repeats_max_count
);
3066 helpmod_reply(sender
, returntype
, "Repeat minimum length: %d", profile
->repeats_min_length
);
3067 helpmod_reply(sender
, returntype
, "Symbol repeat tolerance: %d", profile
->symbol_repeat_max_count
);
3068 helpmod_reply(sender
, returntype
, "Character repeat tolerance: %d", profile
->character_repeat_max_count
);
3069 helpmod_reply(sender
, returntype
, "Continuous symbol tolerance: %d", profile
->symbol_max_count
);
3070 helpmod_reply(sender
, returntype
, "Flood tolerance: %d", profile
->tolerance_flood
);
3071 helpmod_reply(sender
, returntype
, "Spam tolerance: %d", profile
->tolerance_spam
);
3072 helpmod_reply(sender
, returntype
, "Spam multiplier: %f", profile
->constant_spam
);
3073 helpmod_reply(sender
, returntype
, "Warning limit: %d", profile
->tolerance_warn
);
3074 helpmod_reply(sender
, returntype
, "Kick limit: %d", profile
->tolerance_kick
);
3075 helpmod_reply(sender
, returntype
, "Ban limit: %d", profile
->tolerance_remove
);
3077 else if (!ci_strcmp(argv
[0], "edit"))
3080 double dbl_val
= -1;
3084 helpmod_reply(sender
, returntype
, "Can not edit a lamer control profile: Syntax error");
3088 profile
= hlc_get(argv
[1]);
3090 if (profile
== NULL
)
3092 helpmod_reply(sender
, returntype
, "Can not edit a lamer control profile: Profile %s not found", argv
[1]);
3096 sscanf(argv
[3], "%d", &int_val
);
3097 sscanf(argv
[3], "%lf", &dbl_val
);
3100 { /* All int values are also valid double values */
3101 helpmod_reply(sender
, returntype
, "Can not edit a lamer control profile: Invalid argument");
3105 if (!ci_strcmp(argv
[2], "caps_percentage"))
3106 profile
->caps_max_percentage
= int_val
;
3107 else if (!ci_strcmp(argv
[2], "caps_count"))
3108 profile
->caps_min_count
= int_val
;
3109 else if (!ci_strcmp(argv
[2], "repeat_tolerance"))
3110 profile
->repeats_max_count
= int_val
;
3111 else if (!ci_strcmp(argv
[2], "repeat_length"))
3112 profile
->repeats_min_length
= int_val
;
3113 else if (!ci_strcmp(argv
[2], "symbol_repeat"))
3114 profile
->symbol_repeat_max_count
= int_val
;
3115 else if (!ci_strcmp(argv
[2], "character_repeat"))
3116 profile
->character_repeat_max_count
= int_val
;
3117 else if (!ci_strcmp(argv
[2], "continuous_symbol"))
3118 profile
->symbol_max_count
= int_val
;
3119 else if (!ci_strcmp(argv
[2], "flood_tolerance"))
3120 profile
->tolerance_flood
= int_val
;
3121 else if (!ci_strcmp(argv
[2], "spam_tolerance"))
3122 profile
->tolerance_spam
= int_val
;
3123 else if (!ci_strcmp(argv
[2], "spam_multiplier"))
3124 profile
->constant_spam
= dbl_val
;
3125 else if (!ci_strcmp(argv
[2], "warn_limit"))
3126 profile
->tolerance_warn
= int_val
;
3127 else if (!ci_strcmp(argv
[2], "kick_limit"))
3128 profile
->tolerance_kick
= int_val
;
3129 else if (!ci_strcmp(argv
[2], "ban_limit"))
3130 profile
->tolerance_remove
= int_val
;
3133 helpmod_reply(sender
, returntype
, "Can not edit a lamer control profile: No component named %s", argv
[2]);
3136 helpmod_reply(sender
, returntype
, "Lamer control profile component value changed succesfully.");
3140 static void helpmod_cmd_ged (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3142 helpmod_editor
*editor
;
3144 if (sender
->editor
== NULL
)
3145 { /* Start a new editor */
3148 helpmod_reply(sender
, returntype
, "Can not use ged: Filename not specified");
3151 editor
= hed_open(sender
, argv
[0]);
3154 helpmod_reply(sender
, returntype
, "Can not use ged: Invalid filename %s", argv
[0]);
3157 if (editor
->user
!= sender
)
3159 helpmod_reply(sender
, returntype
, "Can not use ged: File %s is currently being edited by %s", editor
->filename
, huser_get_nick(editor
->user
));
3162 editor
->user
= sender
;
3163 sender
->editor
= editor
;
3165 helpmod_reply(sender
, returntype
, "Ged: %d", hed_byte_count(editor
));
3169 hed_command(sender
, returntype
, ostr
, argc
, argv
);
3173 static void helpmod_cmd_text (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3179 if (argc
== 0 || !ci_strcmp(argv
[0], "list"))
3182 struct dirent
*dent
;
3183 char buffer
[384], **lines
, *start
;
3184 int nwritten
, bufpos
= 0, nlines
= 0,i
;
3186 dir
= opendir(HELPMOD_TEXT_DIR
);
3187 assert(dir
!= NULL
);
3189 /* First pass, count */
3190 for (dent
= readdir(dir
);dent
!= NULL
;dent
= readdir(dir
))
3192 /* Skip stuff like . and .. */
3193 if (!strncmp(dent
->d_name
, ".", 1))
3200 helpmod_reply(sender
, returntype
, "No texts are available.");
3204 helpmod_reply(sender
, returntype
, "Following texts are available:");
3207 lines
= (char **)malloc(sizeof(char*) * nlines
);
3208 *lines
= (char *)malloc(sizeof(char) * (HED_FILENAME_LENGTH
+1) * nlines
);
3209 /* We need the start to free this array */
3211 for(i
=0;i
< nlines
;i
++)
3212 lines
[i
] = &lines
[0][(HED_FILENAME_LENGTH
+1) * i
];
3215 /* Second pass, create array */
3217 for (dent
= readdir(dir
), i
= 0;dent
!= NULL
&& i
< nlines
;dent
= readdir(dir
))
3219 /* Skip stuff like . and .. */
3220 if (!strncmp(dent
->d_name
, ".", 1))
3222 strncpy(lines
[i
], dent
->d_name
, 64);
3226 qsort(*lines
, nlines
, sizeof(char)*(HED_FILENAME_LENGTH
+1), (int (*)(const void*, const void*))&strcmp
);
3228 for (i
= 0;i
< nlines
;i
++)
3232 buffer
[bufpos
] = ' ';
3235 sprintf(buffer
+ bufpos
, "%s%n", lines
[i
], &nwritten
);
3238 if (bufpos
> (384 - (HED_FILENAME_LENGTH
+1)))
3240 helpmod_reply(sender
, returntype
, "%s", buffer
);
3246 helpmod_reply(sender
, returntype
, "%s", buffer
);
3253 else if (!ci_strcmp(argv
[0], "show"))
3255 char fname_buffer
[128], buffer
[512];
3258 helpmod_reply(sender
, returntype
, "Can not show text: Text not specified");
3261 if (!hed_is_valid_filename(argv
[1]))
3263 helpmod_reply(sender
, returntype
, "Can not show text: Invalid filename");
3266 sprintf(fname_buffer
, HELPMOD_TEXT_DIR
"/%s" ,argv
[1]);
3267 in
= fopen(fname_buffer
, "rwt");
3270 helpmod_reply(sender
, returntype
, "Can not show text: Text %s not found", argv
[1]);
3275 if (!fgets(buffer
, 512, in
))
3277 if (returntype
!= NULL
&& huser_get_level(sender
) >= H_TRIAL
)
3278 helpmod_message_channel(hchannel_get_by_channel(returntype
), "%s", buffer
);
3280 helpmod_reply(sender
, returntype
, "%s", buffer
);
3286 if (huser_get_level(sender
) < H_STAFF
)
3288 helpmod_reply(sender
, returntype
, "Can not handle text: Insufficient user level");
3292 if (!ci_strcmp(argv
[0], "add"))
3294 char fname_buffer
[128];
3297 helpmod_reply(sender
, returntype
, "Can not add text: Text not specified");
3300 if (!hed_is_valid_filename(argv
[1]))
3302 helpmod_reply(sender
, returntype
, "Can not add text: Invalid filename");
3305 sprintf(fname_buffer
, HELPMOD_TEXT_DIR
"/%s" ,argv
[1]);
3306 if ((in
= fopen(fname_buffer
, "rt")) != NULL
)
3308 helpmod_reply(sender
, returntype
, "Can not add text: Text %s already exists", argv
[1]);
3313 if ((in
= fopen(fname_buffer
, "wt")) == NULL
)
3315 helpmod_reply(sender
, returntype
, "Can not add text: Unexpected error, please contact strutsi");
3320 helpmod_reply(sender
, returntype
, "Text %s added succesfully", argv
[1]);
3322 else if (!ci_strcmp(argv
[0], "del"))
3324 char fname_buffer
[128];
3327 helpmod_reply(sender
, returntype
, "Can not delete text: Text not specified");
3330 if (!hed_is_valid_filename(argv
[1]))
3332 helpmod_reply(sender
, returntype
, "Can not delete text: Invalid filename");
3335 sprintf(fname_buffer
, HELPMOD_TEXT_DIR
"/%s" ,argv
[1]);
3337 if (!remove(fname_buffer
))
3338 helpmod_reply(sender
, returntype
, "Text %s removed", argv
[1]);
3340 helpmod_reply(sender
, returntype
, "Can not delete text: Text %s does not exist or can not be deleted", argv
[1]);
3344 helpmod_reply(sender
, returntype
, "Can not handle text: Unknown operation %s", argv
[0]);
3349 static void helpmod_cmd_rating (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3352 hstat_account_entry sum
= {0,0,0,0};
3358 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
3362 helpmod_reply(sender
, returntype
, "Can not show rating: Unknown channel");
3365 if (sender
->account
== NULL
)
3367 helpmod_reply(sender
, returntype
, "Can not show rating: You do not have an account");
3370 for (ptr
= sender
->account
->stats
;ptr
!= NULL
;ptr
= ptr
->next
)
3371 if (ptr
->hchan
== hchan
)
3373 if (hstat_day() == 0)
3374 { /* Sunday screws the indexing */
3375 for (i
= 0;i
< 7;i
++)
3376 HSTAT_ACCOUNT_SUM(sum
, sum
, ptr
->week
[i
]);
3380 for (i
= 1;i
<= hstat_day();i
++)
3381 HSTAT_ACCOUNT_SUM(sum
, sum
, ptr
->week
[i
]);
3384 helpmod_reply(sender
, returntype
, "Your rating for channel %s for this week is: %s", hchannel_get_name(hchan
), helpmod_strtime(sum
.time_spent
));
3387 helpmod_reply(sender
, returntype
, "Can not show rating: You do not have any statistics for channel %s", hchannel_get_name(hchan
));
3390 static void helpmod_cmd_writedb (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3392 rename(HELPMOD_DEFAULT_DB
, HELPMOD_DEFAULT_DB
".old");
3393 helpmod_config_write(HELPMOD_DEFAULT_DB
);
3395 helpmod_reply(sender
, returntype
, "Database written");
3398 static void helpmod_cmd_evilhack1 (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3403 helpmod_reply(sender
, returntype
, "hstat_cycle: %d", hstat_cycle
);
3406 if (!sscanf(argv
[0], "%d", &tmp
) || tmp
< 0)
3408 helpmod_reply(sender
, returntype
, "Invalid argument");
3412 helpmod_reply(sender
, returntype
, "hstat_cycle is now: %d", hstat_cycle
);
3416 static void helpmod_cmd_evilhack2 (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3418 haccount
*hacc
= haccounts
;
3421 hstat_account_entry tmp_account
;
3422 hstat_channel_entry tmp_channel
;
3427 helpmod_reply(sender
, returntype
, "Syntax error: evilhack2 <first> <second>");
3431 if (!sscanf(argv
[0],"%d", &first
) || first
< 0 || first
> 9)
3433 helpmod_reply(sender
, returntype
, "Syntax error: Invalid first");
3437 if (!sscanf(argv
[1],"%d", &second
) || second
< 0 || second
> 9)
3439 helpmod_reply(sender
, returntype
, "Syntax error: Invalid second");
3443 for (;hacc
;hacc
= hacc
->next
)
3444 for (ptr
= hacc
->stats
;ptr
;ptr
= ptr
->next
)
3446 tmp_account
= ptr
->longterm
[first
];
3447 ptr
->longterm
[first
] = ptr
->longterm
[second
];
3448 ptr
->longterm
[second
] = tmp_account
;
3451 for (hchan
= hchannels
;hchan
;hchan
= hchan
->next
)
3453 tmp_channel
= hchan
->stats
->longterm
[first
];
3454 hchan
->stats
->longterm
[first
] = hchan
->stats
->longterm
[second
];
3455 hchan
->stats
->longterm
[second
] = tmp_channel
;
3458 helpmod_reply(sender
, returntype
, "Evilhack2 done: Swapped %d and %d", first
, second
);
3461 static void helpmod_cmd_channel (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3464 hchannel_user
*hchanuser
;
3470 helpmod_reply(sender
, returntype
, "Can not show channel: Channel not specified");
3474 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
3476 helpmod_reply(sender
, returntype
, "Users for channel %s", hchannel_get_name(hchan
));
3477 helpmod_reply(sender
, returntype
, "Nick Account User level Idle time");
3479 for (hchanuser
= hchan
->channel_users
;hchanuser
;hchanuser
=hchanuser
->next
)
3480 helpmod_reply(sender
, returntype
, "%-16s %-16s %-24s %s",hchanuser
->husr
->real_user
->nick
,hchanuser
->husr
->account
?hchanuser
->husr
->account
->name
->content
:"-",hlevel_name(huser_get_level(hchanuser
->husr
)), helpmod_strtime(time(NULL
)-huser_on_channel(hchanuser
->husr
, hchan
)->last_activity
));
3482 helpmod_reply(sender
, returntype
, "Listed %d users for channel %s", hchannel_count_users(hchan
, H_ANY
), hchannel_get_name(hchan
));
3485 static void helpmod_cmd_weekstats (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3488 hstat_accounts_array arr
;
3496 helpmod_reply(sender
, returntype
, "Can not list weekly stats: Channel not specified");
3500 HCHANNEL_VERIFY_AUTHORITY(hchan
, sender
);
3504 if (!ci_strcmp(argv
[0], "opers") || !ci_strcmp(argv
[0], "o"))
3506 else if (!ci_strcmp(argv
[0], "staff") || !ci_strcmp(argv
[0], "s"))
3508 else if (!ci_strcmp(argv
[0], "all") || !ci_strcmp(argv
[0], "a"))
3512 arr
= create_hstat_account_array(hchan
, lvl
, HSTAT_ACCOUNT_ARRAY_WEEKSTATS
);
3514 helpmod_reply(sender
, returntype
, "Weekly statistics for %ss on channel %s", hlevel_name(lvl
), hchannel_get_name(hchan
));
3516 for (i
=0;i
< arr
.arrlen
;i
++)
3517 if (arr
.array
[i
].time_spent
> HDEF_m
)
3518 helpmod_reply(sender
, returntype
, "%-20s %-20s %-20s",((haccount
*)(arr
.array
[i
].owner
))->name
->content
, helpmod_strtime(arr
.array
[i
].prime_time_spent
), helpmod_strtime(arr
.array
[i
].time_spent
));
3524 void helpmod_cmd_load (huser
*sender
, channel
*returntype
, char* arg
, int argc
, char *argv
[])
3527 char buf
[128] = "helpmod/default";
3530 helpmod_reply(sender
, returntype
, "Warning: No config specified, using default");
3533 if (strlen(arg
) >= 100)
3536 sprintf(buf
, "helpmod/%s", arg
);
3539 if (!(tmp_file
= fopen(buf
, "rt")))
3541 helpmod_reply(sender
, returntype
, "File %s not found", buf
);
3547 helpmod_clear_aliases(&aliases
);
3548 helpmod_clear_all_entries();
3549 helpmod_init_entry(&helpmod_base
);
3550 huser_reset_states();
3551 helpmod_load_entries(buf
);
3552 strcpy(helpmod_db
, buf
);
3553 helpmod_reply(sender
, returntype
, "New config loaded and system reset");
3556 void helpmod_cmd_status (huser
*sender
, channel
* returntype
, char* ostr
, int argc
, char *argv
[])
3558 helpmod_reply(sender
, returntype
, "HelpMod version %s (built %s, up %s)", HELPMOD_VERSION
, __DATE__
, helpmod_strtime(time(NULL
) - helpmod_startup_time
));
3559 helpmod_reply(sender
, returntype
, "Channels %d", hchannel_count());
3560 helpmod_reply(sender
, returntype
, "Accounts %d", haccount_count(H_ANY
));
3561 helpmod_reply(sender
, returntype
, "Users %d", huser_count());
3562 helpmod_reply(sender
, returntype
, "Help entries %ld", helpmod_entry_count(helpmod_base
));
3563 helpmod_reply(sender
, returntype
, "Bans %d", hban_count());
3564 helpmod_reply(sender
, returntype
, "Help provided %ld", helpmod_usage
);
3565 helpmod_reply(sender
, returntype
, "Tickets %d", hticket_count());
3568 /* not really a command, but help wants this one */
3569 void helpmod_send_help(huser
* target
)
3573 for (i
=0;i
<target
->state
->text_lines
;i
++)
3574 helpmod_reply(target
, NULL
, "%s", target
->state
->text
[i
]->content
);
3575 for (i
=0;i
<target
->state
->option_count
;i
++)
3576 helpmod_reply(target
, NULL
, "%d) %s", i
+1, target
->state
->options
[i
]->description
->content
);
3577 if (!target
->state
->option_count
)
3579 helpmod_reply(target
, NULL
, "This concludes the help for this topic, if you want to, you can restart the service with the 'help' command, or return to the previous entry by selecting 0");
3583 void helpmod_cmd_command(huser
* sender
, channel
* returntype
, char* arg
, int argc
, char *argv
[])
3586 char buffer
[512], *ptr
= argv
[0];
3591 helpmod_reply(sender
, returntype
, "Usage: command [name of the command] for a list see 'showcommands'");
3595 hcom
= hcommand_get(argv
[0], huser_get_level(sender
));
3599 helpmod_reply(sender
, returntype
, "Unknown command '%s'", argv
[0]);
3605 *ptr
= tolower(*ptr
);
3607 /* ?,?+.?- is handled like this because windows is shit */
3608 if (!ci_strcmp(argv
[0], "?"))
3609 sprintf(buffer
, "./helpmod2/commands/questionmark");
3610 else if (!ci_strcmp(argv
[0], "?+"))
3611 sprintf(buffer
, "./helpmod2/commands/questionmarkplus");
3612 else if (!ci_strcmp(argv
[0], "?-"))
3613 sprintf(buffer
, "./helpmod2/commands/questionmarkminus");
3615 sprintf(buffer
, "./helpmod2/commands/%s", argv
[0]);
3617 if ((in
= fopen(buffer
, "rt")) == NULL
)
3619 helpmod_reply(sender
, returntype
, "No help available for command '%s' (Ask strutsi to write it)", argv
[0]);
3625 fgets(buffer
, 512, in
);
3628 helpmod_reply(sender
, returntype
, "%s", buffer
);
3634 void helpmod_cmd_help (huser
* sender
, channel
* returntype
, char* arg
, int argc
, char *argv
[])
3638 if (helpmod_base
== NULL
|| !helpmod_base
->option_count
)
3640 helpmod_reply(sender
, returntype
, "The help service is not available at this time, please try again later");
3646 sender
->state
= helpmod_base
;
3647 helpmod_send_help(sender
);
3651 if (!sscanf(arg
, "%d", &hlp_target
))
3655 tmp
= helpmod_get_alias(arg
);
3657 helpmod_reply(sender
, returntype
, "Invalid value. Either use 'help' to restart or give an integer as a valid selection");
3660 sender
->state
= tmp
;
3661 helpmod_send_help(sender
);
3667 if (!helpmod_valid_selection(sender
->state
, hlp_target
))
3669 if (!sender
->state
->option_count
)
3670 helpmod_reply(sender
, returntype
, "There are no more options to choose from, you can restart the service by giving the 'help' command or select 0 to return to the previous entry");
3671 else if (!sender
->state
->parent
)
3672 helpmod_reply(sender
, returntype
, "Bad selection, please enter your selection as an integer from %d to %d", 1, sender
->state
->option_count
);
3674 helpmod_reply(sender
, returntype
, "Bad selection, please enter your selection as an integer from %d to %d, selecting 0 will take you to the previous entry", 1, sender
->state
->option_count
);
3678 sender
->state
= helpmod_make_selection(sender
->state
, hlp_target
);
3679 helpmod_send_help(sender
);
3683 /* adds all of the abowe to the system */
3684 void hcommands_add(void)
3686 hcommand_add("help", H_PEON
, helpmod_cmd_help
,"Offers the H1 type help");
3687 hcommand_add("status",H_OPER
, helpmod_cmd_status
,"Gives service status");
3688 hcommand_add("load", H_OPER
, helpmod_cmd_load
,"Loads a new help database");
3689 hcommand_add("aliases",H_STAFF
, helpmod_cmd_aliases
,"Lists all aliases currently in use");
3690 hcommand_add("showcommands", H_LAMER
, helpmod_cmd_showcommands
,"Lists all commands available to you");
3692 hcommand_add("improper", H_STAFF
, helpmod_cmd_improper
, "Sets the userlevel of the target to banned (lvl 0). Long term ban.");
3693 hcommand_add("peon", H_STAFF
, helpmod_cmd_peon
, "Sets the userlevel of the target to peon (lvl 1)");
3694 hcommand_add("friend", H_STAFF
, helpmod_cmd_friend
, "Sets the userlevel of the target to friend (lvl 2)");
3695 hcommand_add("trial", H_OPER
, helpmod_cmd_trial
, "Sets the userlevel of the target to trial staff (lvl 3)");
3696 hcommand_add("staff", H_OPER
, helpmod_cmd_staff
, "Sets the userlevel of the target to staff (lvl 4)");
3698 hcommand_add("oper", H_OPER
, helpmod_cmd_oper
, "Sets the userlevel of the target to oper (lvl 5)");
3699 hcommand_add("admin", H_ADMIN
, helpmod_cmd_admin
, "Sets the userlevel of the target to admin (lvl 6)");
3700 hcommand_add("deluser", H_OPER
, helpmod_cmd_deluser
, "Removes an account from " HELPMOD_NICK
);
3701 hcommand_add("listuser", H_STAFF
, helpmod_cmd_listuser
, "Lists user accounts of " HELPMOD_NICK
);
3703 hcommand_add("chanconf", H_STAFF
, helpmod_cmd_chanconf
, "Channel configuration");
3704 hcommand_add("acconf", H_TRIAL
, helpmod_cmd_acconf
, "Personalise " HELPMOD_NICK
" behaviour");
3705 hcommand_add("welcome", H_STAFF
, helpmod_cmd_welcome
, "Views or changes the channel welcome message");
3706 hcommand_add("censor", H_STAFF
, helpmod_cmd_censor
, "Handles the censored patterns for a channel");
3708 hcommand_add("queue", H_TRIAL
, helpmod_cmd_queue
, "Handles the channel queue");
3709 hcommand_add("next", H_TRIAL
, helpmod_cmd_next
, "Same as queue next");
3710 hcommand_add("done", H_TRIAL
, helpmod_cmd_done
, "Same as queue done");
3711 hcommand_add("enqueue", H_TRIAL
, helpmod_cmd_enqueue
, "Same as queue on or chanconf +3");
3712 hcommand_add("dequeue", H_TRIAL
, helpmod_cmd_dequeue
, "Same as queue off or chanconf -3");
3713 hcommand_add("autoqueue", H_TRIAL
, helpmod_cmd_autoqueue
, "Same as queue maintain");
3715 hcommand_add("?", H_PEON
, helpmod_cmd_term_find
, "Same as term find with multiple targets");
3716 hcommand_add("?+", H_TRIAL
, helpmod_cmd_term_find_plus
, "Multitarget term find which advances the queue");
3717 hcommand_add("?-", H_TRIAL
, helpmod_cmd_term_find_minus
, "Multitarget term find which removes users from queue");
3718 hcommand_add("term", H_STAFF
, helpmod_cmd_term
, "Term handling");
3720 hcommand_add("klingon", H_OPER
, helpmod_cmd_klingon
, "Phrases in klingon, both targeted and general");
3721 hcommand_add("out", H_STAFF
, helpmod_cmd_out
, "Sets the userlevel of the target to banned (lvl 0) for a short while");
3722 hcommand_add("kick", H_TRIAL
, helpmod_cmd_kick
, "Kicks user(s) from a channel");
3723 hcommand_add("ban", H_STAFF
, helpmod_cmd_ban
, "Handles global bans");
3724 hcommand_add("chanban", H_TRIAL
, helpmod_cmd_chanban
, "Handles channel bans");
3725 hcommand_add("dnmo", H_STAFF
, helpmod_cmd_dnmo
, "DoNotMessageOpers informs the luser of his mistake and sets him to the bottom of the queue");
3726 hcommand_add("lamercontrol", H_OPER
, helpmod_cmd_lamercontrol
, "Views or changes the channel lamercontrol profile");
3727 hcommand_add("topic", H_STAFF
, helpmod_cmd_topic
, "Handles the topic of a channel");
3728 hcommand_add("idlekick", H_OPER
, helpmod_cmd_idlekick
, "Views or sets the idle kick time");
3729 hcommand_add("everyoneout", H_STAFF
, helpmod_cmd_everyoneout
, "Removes all normal users from a channel and enforces +i");
3731 hcommand_add("stats", H_STAFF
, helpmod_cmd_stats
, "Shows staff activity statistics");
3732 hcommand_add("chanstats", H_STAFF
, helpmod_cmd_chanstats
, "Shows channel activity statistics");
3733 hcommand_add("activestaff", H_ADMIN
, helpmod_cmd_activestaff
, "Shows active staff members for a channel");
3734 hcommand_add("top10", H_STAFF
, helpmod_cmd_top10
, "Shows the top 10 most active staff");
3735 hcommand_add("report", H_OPER
, helpmod_cmd_report
, "Sets the channel where to report this channels statistics every 5 minutes");
3737 hcommand_add("whoami", H_LAMER
, helpmod_cmd_whoami
, "Tells who you are to " HELPMOD_NICK
);
3738 hcommand_add("whois", H_STAFF
, helpmod_cmd_whois
, "Tells you who someone is");
3739 hcommand_add("command", H_LAMER
, helpmod_cmd_command
, "Gives detailed information on a command");
3740 hcommand_add("addchan", H_ADMIN
, helpmod_cmd_addchan
, "Joins " HELPMOD_NICK
" to a new channel");
3741 hcommand_add("delchan", H_ADMIN
, helpmod_cmd_delchan
, "Removes " HELPMOD_NICK
" permanently from a channel");
3743 hcommand_add("seen", H_STAFF
, helpmod_cmd_seen
, "Tells when a specific user/account has had activity");
3744 hcommand_add("op", H_STAFF
, helpmod_cmd_op
, "Sets mode +o on channels");
3745 hcommand_add("deop", H_STAFF
, helpmod_cmd_deop
, "Sets mode -o on channels");
3746 hcommand_add("voice", H_TRIAL
, helpmod_cmd_voice
, "Sets mode +v on channels");
3747 hcommand_add("devoice", H_TRIAL
, helpmod_cmd_devoice
, "Sets mode -v on channels");
3749 hcommand_add("invite", H_PEON
, helpmod_cmd_invite
, "Invites you to a channel");
3750 hcommand_add("ticket", H_TRIAL
, helpmod_cmd_ticket
, "Gives a ticket to be used with invite");
3751 hcommand_add("resolve", H_STAFF
, helpmod_cmd_resolve
, "Resolves (deletes) a ticket");
3752 hcommand_add("tickets", H_STAFF
, helpmod_cmd_tickets
, "Lists all valid tickets for a channel");
3753 hcommand_add("showticket", H_STAFF
, helpmod_cmd_showticket
, "Shows the ticket for the user");
3755 hcommand_add("termstats", H_OPER
, helpmod_cmd_termstats
, "Lists usage statistics for terms");
3756 hcommand_add("checkchannel", H_STAFF
, helpmod_cmd_checkchannel
, "Shows channel information for any channel");
3757 hcommand_add("message", H_TRIAL
, helpmod_cmd_message
, "Sends a message to a channel");
3758 hcommand_add("version", H_PEON
, helpmod_cmd_version
, "G version information");
3759 hcommand_add("ticketmsg", H_STAFF
, helpmod_cmd_ticketmsg
, "Handle the ticket message for a channel");
3761 hcommand_add("lcedit", H_ADMIN
, helpmod_cmd_lcedit
, "Lamer control profile manager");
3762 hcommand_add("ged", H_STAFF
, helpmod_cmd_ged
, "Ged IRC text editor");
3763 hcommand_add("text", H_PEON
, helpmod_cmd_text
, "Lists or shows text files");
3764 hcommand_add("evilhack1", H_ADMIN
, helpmod_cmd_evilhack1
, "An evil hack, don't use");
3765 hcommand_add("evilhack2", H_ADMIN
, helpmod_cmd_evilhack2
, "Another evil hack, don't use");
3767 hcommand_add("statsdump", H_ADMIN
, helpmod_cmd_statsdump
, "Statistics dump command");
3768 hcommand_add("statsrepair", H_ADMIN
, helpmod_cmd_statsrepair
, "Statistics repair command");
3769 hcommand_add("statsreset", H_ADMIN
, helpmod_cmd_statsreset
, "Statistics reset command");
3770 hcommand_add("rating", H_TRIAL
, helpmod_cmd_rating
, "Simple rating for the current week");
3771 hcommand_add("writedb", H_OPER
, helpmod_cmd_writedb
, "Writes the " HELPMOD_NICK
" database to disk");
3773 hcommand_add("channel", H_TRIAL
, helpmod_cmd_channel
, "Gives a list of all channel users");
3774 hcommand_add("weekstats", H_ADMIN
, helpmod_cmd_weekstats
, "Gives weekly stats for a channel");
3775 /*hcommand_add("megod", H_PEON, helpmod_cmd_megod, "Gives you userlevel 4, if you see this in the final version, please kill strutsi");*/
3776 /*hcommand_add("test", H_PEON, helpmod_cmd_test, "Gives you userlevel 4, if you see this in the final version, please kill strutsi");*/
3779 void helpmod_command(huser
*sender
, channel
* returntype
, char *args
)
3781 int argc
= 0, useless_var
;
3782 char args_copy
[512];
3783 char *parsed_args
[H_CMD_MAX_ARGS
+ 4], *ptr
= args_copy
;
3785 /* only accept commands from valid sources */
3786 if (huser_get_level(sender
) > H_ADMIN
)
3789 if (returntype
&& !strncmp(args
, helpmodnick
->nick
, strlen(helpmodnick
->nick
)))
3794 args
+=strlen(helpmodnick
->nick
)+1;
3797 if (*args
== '-' || *args
== '?')
3800 strncpy(args_copy
, args
, (sizeof(args_copy
) - 1));
3801 args_copy
[sizeof(args_copy
) - 1] = '\0';
3803 /* FIX stringituki */
3804 while (argc
< (H_CMD_MAX_ARGS
+ 4))
3806 while (isspace(*ptr
) && *ptr
)
3812 if (*ptr
== '"' && strchr(ptr
+1, '"'))
3813 { /* string support */
3814 parsed_args
[argc
++] = ptr
+1;
3815 ptr
= strchr(ptr
+1, '"');
3819 while (!isspace(*ptr
) && *ptr
)
3827 parsed_args
[argc
++] = ptr
;
3829 while (!isspace(*ptr
) && *ptr
)
3842 /* old H compatibility */
3843 if (sscanf(parsed_args
[0], "%d", &useless_var
) && returntype
== NULL
)
3845 helpmod_cmd_help(sender
, NULL
, parsed_args
[0], 1, NULL
);
3850 char *ostr
= args
, **argv
= (char**)&parsed_args
;
3851 hcommand
*hcom
= hcommand_get(parsed_args
[0], huser_get_level(sender
));
3855 controlwall(NO_DEVELOPER
, NL_ALL_COMMANDS
, "(G) From: %s!%s@%s%s%s: %s",
3856 sender
->real_user
->nick
, sender
->real_user
->ident
,
3857 sender
->real_user
->host
->name
->content
, IsAccount(sender
->real_user
)?"/":"",
3858 IsAccount(sender
->real_user
)?sender
->real_user
->authname
:"", args
);
3859 if ((returntype
== NULL
) ||
3860 (sender
->account
!= NULL
&& !(sender
->account
->flags
& H_NO_CMD_ERROR
)))
3861 helpmod_reply(sender
, returntype
, "Unknown command '%s', please see showcommands for a list of all commands available to you", parsed_args
[0]);
3865 controlwall(NO_DEVELOPER
, NL_ALL_COMMANDS
, "(G) From: %s!%s@%s%s%s: %s", sender
->real_user
->nick
, sender
->real_user
->ident
, sender
->real_user
->host
->name
->content
, IsAccount(sender
->real_user
)?"/":"", IsAccount(sender
->real_user
)?sender
->real_user
->authname
:"", args
);
3867 hcom
->function(sender
, returntype
, ostr
, argc
, argv
);
3873 #undef DEFINE_HCHANNEL
3874 #undef HCHANNEL_VERIFY_AUTHORITY