public async Task EnsureCreated(IUser user, IGuild guild) { var(serverCreated, userCreated) = (false, false); var server = await _serverRepository.FindAsync(guild.Id, (qry, ctx) => qry.Include(s => s.ServerBotRoles)); if (server == null) { var botRoles = await _botRoleRepository.GetAsync(); server = new Server { Id = guild.Id, ServerBotRoles = botRoles.Select(role => new ServerBotRole { Role = role }).ToList() }; await _serverRepository.PostAsync(server); serverCreated = true; } var userEntity = await _userRepository.FindAsync(user.Id); if (userEntity == null) { userEntity = new User { Id = user.Id, }; await _userRepository.PostAsync(userEntity); userCreated = true; } if (serverCreated || userCreated) { var botRole = user.Id != _config.OwnerId ? server.ServerBotRoles.FirstOrDefault(br => br.RoleId == (int)BotRoleLevel.User) : server.ServerBotRoles.FirstOrDefault(br => br.RoleId == (int)BotRoleLevel.Owner); var serverUser = new ServerUser { Role = botRole, Server = server, User = userEntity }; await _serverUserRepository.PostAsync(serverUser); await _serverUserRepository.SaveAllChangesAsync(); } }
public async Task AuthorizeUser(IUser user) { await UserDataService.EnsureCreated(user, Context.Guild); var server = await _serverRepository.FindAsync(Context.Guild.Id, (query, _) => query .Include(s => s.ServerUsers) .Include(s => s.ServerBotRoles)); var adminRole = server.ServerBotRoles.FirstOrDefault(role => role.RoleId == (int)BotRoleLevel.Admin); var serverUser = server.ServerUsers.FirstOrDefault(usr => usr.UserId == user.Id); serverUser.Role = adminRole; await _serverRepository.SaveAllChangesAsync(); ReplyAsync("User authorized"); }
public async Task AssignItem(IUser user, [Remainder] string itemName) { UserDataService.EnsureCreated(user, Context.Guild); var server = await _serverRepository.FindAsync(Context.Guild.Id, (qry, context) => qry.Include(s => s.ServerUsers)); var items = (await _itemRepository.QueryItem(itemName)).OrderByDescending(item => item.ItemLevel).ToList(); if (!items.Any()) { await ReplyAsync($"\"{itemName}\" returned no results."); return; } var item = items.First(); if (items.Count > 1) { var selection = await _queryService.SendOptionSelectQuery( $"\"{itemName}\" yielded multiple results. Please select below", items, item => item.Name, Context.Channel, CancellationToken.None); if (selection == -1) { await ReplyAsync("Operation cancelled"); return; } item = items[selection]; } await ReplyAsync("", false, CreateItemEmbed(item)); }