#include "chat.h" /*----------- implementations of the chat commands ------*/ int cmd_who (users_t *users, user_t *user, int argc, char *argv[]) { user_send(user, "| %-20s | %-8s | %22s | %-10s |\n", "Name", "Status", "IP", "Rank"); for (user_t *i = users->users; i != NULL; i = i->next) user_send(user, "| %-20s | %-8s | %16s:%-5d | %-10s |\n", i->name, (i->activity == DEAD)? "dead" : ( (i->scilenced)? "muted" : "active"), i->hostname, i->port, i->admin == NULL? "peon" : (i->admin->super? "superadmin" : "admin") ); } int cmd_wo (users_t *users, user_t *user, int argc, char *argv[]) { user_send(user, " you cannot hear whispers anymore.\n"); user->hear_whispers = 0; } int cmd_ws (users_t *users, user_t *user, int argc, char *argv[]) { user_send(user, " you can hear whispers again.\n"); user->hear_whispers = 1; } int cmd_setmotd (users_t *users, user_t *user, int argc, char *argv[]) { int i,j; for (i = 1, j = 0; i < argc; ++i) { for (int k = 0; argv[i][k] != '\0'; ++k) users->motd[j++] = argv[i][k]; users->motd[j++] = ' '; } users->motd[j++] = '\n'; users->motd[j] = '\0'; users_sendf(users, " %s sets a new MOTD: %s", user->name, users->motd); } int cmd_motd (users_t *users, user_t *user, int argc, char *argv[]) { user_send(user, users->motd); } int cmd_able (users_t *users, user_t *user, int argc, char *argv[]) { int i; if (argc < 3) { user_send(user, " usage: !able user cmnd\n"); return 0; } user_t *target = users_get(users, argv[1]); if (target == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } /* find the command in the array */ for ( i = 0; commands[i].function != NULL && strcmp(commands[i].name, argv[2]); ++i) ; if (commands[i].function == NULL) { user_send(user, " no command '%s' exists.\n", argv[2]); return 0; } users_sendf(users, " %s %s execute %s.\n", target->name, authorized(commands[i].name, commands[i].regulated, target)? "is authorized to" : "is not authorized to", commands[i].name); return 1; } int cmd_login (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !login passwd\n"); return 0; } if (passwd_login(users->passwd, user, argv[1])) { users_sendf(users, " %s logs in as administrator\n", user->name); } else { users_sendf(users, " %s failed to log in as administrator\n", user->name); fprintf(stderr, "<%s> failed login with passwd '%s'\n", user->name,argv[1]); } return 1; ; } int cmd_kick (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !kick user\n"); return 0; } user_t *victim = users_get(users, argv[1]); if (victim == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } victim->activity = DEAD; users_sendf(users, " %s was kicked by %s.\n", victim->name, user->name); return 1; } int cmd_flood (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !flood N (higher: less tollerence)\n"); return 0; } users->flood_control = atoi(argv[1]); users_sendf(users, " %s sets flood control to %d.\n", user->name, users->flood_control); return 1; } int cmd_ban (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !ban user\n"); return 0; } user_t *victim = users_get(users, argv[1]); if (victim == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } if (victim->admin != NULL && !user->admin->super) { user_send(user, " you can't ban an administrator."); return 0; } user_send(user, "Sorry, that command doesn't really make sense so I removed it.\n"); return 0; } int cmd_quiet (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !quiet user\n"); return 0; } user_t *victim = users_get(users, argv[1]); if (victim == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } if (victim->admin != NULL && !user->admin->super) { user_send(user, " you can't quiet an admin.\n"); return 0; } victim->scilenced = 1; users_sendf(users, " %s has been silenced by %s.\n", victim->name, user->name); } int cmd_voice (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !voice user\n"); return 0; } user_t *victim = users_get(users, argv[1]); if (victim == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } victim->scilenced = 0; users_sendf(users, " %s unmutes %s.\n", user->name, victim->name); } int cmd_deadmin (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !deadmin user\n"); return 0; } user_t *victim = users_get(users, argv[1]); if (victim == NULL) { user_send(user, " no such user '%s'\n", argv[1]); return 0; } if (victim->admin == NULL) { user_send(user, " %s isn't an admin.\n", argv[1]); return 0; } if (victim->admin->super) { user_send(user, " you can't deadmin a fellow superadmin.\n"); user_send(victim, " %s tried to deadmin you.", user->name); return 0; } users_sendf(users, " %s revokes the admin rights of %s!\n", user->name, victim->name); passwd_del(users->passwd, victim->admin->name); victim->admin = NULL; return 1; } int cmd_passwd (users_t *users, user_t *user, int argc, char *argv[]) { admin_t *target; char *pw; if (argc < 2) { user_send(user, " usage: !passwd [target] password\n"); return 0; } if (argc == 3 && !user->admin->super) { user_send(user, " Only superadmins can set other's passwords\n"); return 0; } if (argc == 3) { target = passwd_get(users->passwd, argv[1]); pw = argv[2]; } else { target = user->admin; pw = argv[1]; } if (target == NULL) { user_send(user, " Admin not found.\n"); return 0; } strcpy(target->passwd, pw); user_send(user, " password of %s set to %s\n", target->name, target->passwd); return 1; } int cmd_quit (users_t *users, user_t *user, int argc, char *argv[]) { exit(0); ; } int cmd_name (users_t *users, user_t *user, int argc, char *argv[]) { if (argc < 2) { user_send(user, " usage: !name new_name\n"); return 0; } if (users_get(users, argv[1]) != NULL) { user_send(user, " that name is taken already\n"); return 0; } users_sendf(users, " <%s> is now known as '%s'\n", user->name,argv[1]); strncpy(user->name, argv[1], 31); return 1; } /* --------------the command array itself --------------*/ command_t commands[] = { /* message is the message that will be broadcast to all listeners * when the command is executed by anyone. */ /*name, regulated, function, message */ {"who", UNREGULATED, cmd_who, NULL }, {"ws", UNREGULATED, cmd_ws, NULL }, {"wo", UNREGULATED, cmd_wo, NULL }, {"able", UNREGULATED, cmd_able, NULL }, {"name", UNREGULATED, cmd_name, "%s is now known as %s."}, {"login", UNREGULATED, cmd_login, "%s logs in as an administrator."}, {"kick", ADMIN, cmd_kick, "%s kicks %s."}, {"flood", ADMIN, cmd_flood, NULL}, // {"ban", ADMIN, cmd_ban, "%s bans %s."}, {"motd", UNREGULATED, cmd_motd, NULL}, {"setmotd", ADMIN, cmd_setmotd, NULL}, {"quiet", ADMIN, cmd_quiet, "%s scilences %s."}, {"voice", ADMIN, cmd_voice, "%s scilences %s."}, // {"admin", SUPER, cmd_admin, "%s makes %s an administrator."}, // {"perm", SUPER, cmd_perm, "%s changes the admin rights of %s."}, {"deadmin", SUPER, cmd_deadmin, "%s revokes the admin rights of %s."}, {"passwd", ADMIN, cmd_passwd, "%s changes the password of %s."}, {"quit", ADMIN, cmd_quit, "%s shuts down the server."}, {NULL, SUPER, NULL, NULL} /* sentinel */ };