#include "commands.h" #include "command.h" #include "user.h" #include "l2su.h" #include "uuid/uuid.h" #include #define CMD_MSG_USER_ERROR_LOADING "Error loading users." #define CMD_MSG_USER_ERROR_SAVING "Error saving users." #define CMD_MSG_USER_NO_USER_FOUND "User %s not found." unsigned cmd_user_add(struct l2_context_node *ctx, char **args) { L2_UNUSED(ctx); if (*args) { CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args); } int res; if ((res = l2_user_load()) < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_LOADING); } struct l2_user *user = NULL; l2_user_session_t *session = NULL; session = l2_user_session_new(); if (!session) { CMD_FATAL0("Failed to create a session"); } if ((res = l2_user_session_login(session)) < 0) { CMD_FATAL0("Failed to login"); } else if (!res) { CMD_FATAL0("User declined authorization"); } user = calloc(1, sizeof(struct l2_user)); if (!user) { CMD_FATAL0("Failed to create a user"); } l2_user_init(user); user->session = session; if (l2_user_update_profile(user) < 0) { CMD_FATAL0("Failed to retrieve your profile"); } for (struct l2_user *cur = l2_state.users_head; cur; cur = cur->next) { if (!l2_uuid_compare(&cur->profile.uuid, &user->profile.uuid)) { char uuidstr[UUID_STRLEN + 1]; l2_uuid_to_string(&cur->profile.uuid, uuidstr); CMD_FATAL("A profile with the UUID %s already exists!", uuidstr); } } l2_user_add(user); if (l2_user_save() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_SAVING); } return CMD_RESULT_SUCCESS; } unsigned cmd_user_remove(struct l2_context_node *ctx, char **args) { char *username = NULL; if (*args) { CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args); } l2_cmd_collect_args(ctx, 1, "name", &username); if (l2_user_load() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_LOADING); } struct l2_user *user = l2_user_search(username); if (!user) { CMD_FATAL(CMD_MSG_USER_NO_USER_FOUND, username); } l2_user_delete(user); l2_user_free(user); user = NULL; if (l2_user_save() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_SAVING); } return CMD_RESULT_SUCCESS; } unsigned cmd_user_nick(struct l2_context_node *ctx, char **args) { char *username = NULL; char *newnick = NULL; if (*args) { CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args); } l2_cmd_collect_args(ctx, 2, "name", &username, "#newnick", &newnick); if (l2_user_load() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_LOADING); } struct l2_user *user = l2_user_search(username); if (!user) { CMD_FATAL(CMD_MSG_USER_NO_USER_FOUND, username); } free(user->nickname); user->nickname = newnick ? strdup(newnick) : NULL; if (newnick && !user->nickname) { CMD_FATAL0("Failed to set nickname"); } if (l2_user_save() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_SAVING); } return CMD_RESULT_SUCCESS; } unsigned cmd_user_login(struct l2_context_node *ctx, char **args) { char *username = NULL; if (*args) { CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args); } l2_cmd_collect_args(ctx, 1, "name", &username); if (l2_user_load() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_LOADING); } struct l2_user *user = l2_user_search(username); if (!user) { CMD_FATAL(CMD_MSG_USER_NO_USER_FOUND, username); } int res; if ((res = l2_user_session_login(user->session)) < 0) { CMD_FATAL0("Error logging in"); } else if (!res) { CMD_FATAL0("User declined authorization"); } if (l2_user_update_profile(user) < 0) { CMD_FATAL0("Failed to update your profile"); } if (l2_user_save() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_SAVING); } return CMD_RESULT_SUCCESS; } unsigned cmd_user_list(struct l2_context_node *ctx, char **args) { L2_UNUSED(ctx); if (*args) { CMD_FATAL(CMD_MSG_UNKNOWN_ARGUMENT, *args); } if (l2_user_load() < 0) { CMD_FATAL0(CMD_MSG_USER_ERROR_LOADING); } for (struct l2_user *cur = l2_state.users_head; cur; cur = cur->next) { char uuidstr[UUID_STRLEN + 1]; l2_uuid_to_string(&cur->profile.uuid, uuidstr); if (cur->nickname) { printf("- %s (a.k.a. %s) - %s\n", cur->profile.name, cur->nickname, uuidstr); } else { printf("- %s - %s\n", cur->profile.name, uuidstr); } } return CMD_RESULT_SUCCESS; }