private async Task <DiscordMember> GetRandomVerifiedStaffMember(CommandContext command, Database.Ticket ticket) { if (command.RawArguments.Any()) // An argument was provided, check if this can be parsed into a role { ulong roleID = 0; // Try to parse either discord mention or ID string[] parsedMessage = Utilities.ParseIDs(command.RawArgumentString); if (!ulong.TryParse(parsedMessage[0], out roleID)) { // Try to find role by name roleID = Utilities.GetRoleByName(command.Guild, command.RawArgumentString)?.Id ?? 0; } // Check if a role was found if (roleID == 0) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Could not find a role by that name/ID." }; await command.RespondAsync(error); return(null); } // Check if role rassign should override staff's active status List <Database.StaffMember> staffMembers = Config.randomAssignRoleOverride ? Database.GetAllStaff(ticket.assignedStaffID) : Database.GetActiveStaff(ticket.assignedStaffID); // Randomize the list before checking for roles in order to reduce number of API calls staffMembers = Utilities.RandomizeList(staffMembers); // Get the first staff member that has the role foreach (Database.StaffMember sm in staffMembers) { try { DiscordMember verifiedMember = await command.Guild.GetMemberAsync(sm.userID); if (verifiedMember?.Roles?.Any(role => role.Id == roleID) ?? false) { return(verifiedMember); } } catch (Exception e) { command.Client.Logger.Log(LogLevel.Information, e, "Error occured trying to find a staff member in the rassign command."); } } } else // No role was specified, any active staff will be picked { Database.StaffMember staffEntry = Database.GetRandomActiveStaff(ticket.assignedStaffID); if (staffEntry == null) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Error: There are no other staff members to choose from." }; await command.RespondAsync(error); return(null); } // Get the staff member from discord try { return(await command.Guild.GetMemberAsync(staffEntry.userID)); } catch (NotFoundException) { } } // Send a more generic error if we get to this point and still haven't found the staff member DiscordEmbed err = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Error: Could not find an applicable staff member." }; await command.RespondAsync(err); return(null); }
public async Task OnExecute(CommandContext command) { // Check if the user has permission to use this command. if (!Config.HasPermission(command.Member, "rassign")) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "You do not have permission to use this command." }; await command.RespondAsync("", false, error); command.Client.DebugLogger.LogMessage(LogLevel.Info, "SupportBoi", "User tried to use the rassign command but did not have permission.", DateTime.UtcNow); return; } // Check if ticket exists in the database if (!Database.TryGetOpenTicket(command.Channel.Id, out Database.Ticket ticket)) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "This channel is not a ticket." }; await command.RespondAsync("", false, error); return; } Database.StaffMember staffEntry = Database.GetRandomActiveStaff(ticket.assignedStaffID); if (staffEntry == null) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Error: There are no other staff to choose from." }; await command.RespondAsync("", false, error); return; } DiscordMember staffMember = null; try { staffMember = await command.Guild.GetMemberAsync(staffEntry.userID); } catch (NotFoundException) { } if (staffMember == null) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Error: Could not find user." }; await command.RespondAsync("", false, error); return; } if (!Database.AssignStaff(ticket, staffEntry.userID)) { DiscordEmbed error = new DiscordEmbedBuilder { Color = DiscordColor.Red, Description = "Error: Failed to assign " + staffMember.Mention + " to ticket." }; await command.RespondAsync("", false, error); return; } DiscordEmbed feedback = new DiscordEmbedBuilder { Color = DiscordColor.Green, Description = "Randomly assigned " + staffMember.Mention + " to ticket." }; await command.RespondAsync("", false, feedback); if (Config.assignmentNotifications) { try { DiscordEmbed message = new DiscordEmbedBuilder { Color = DiscordColor.Green, Description = "You have been randomly assigned to a support ticket: " + command.Channel.Mention }; await staffMember.SendMessageAsync("", false, message); } catch (UnauthorizedException) {} } // Log it if the log channel exists DiscordChannel logChannel = command.Guild.GetChannel(Config.logChannel); if (logChannel != null) { DiscordEmbed logMessage = new DiscordEmbedBuilder { Color = DiscordColor.Green, Description = staffMember.Mention + " was was assigned to " + command.Channel.Mention + " by " + command.Member.Mention + "." }; await logChannel.SendMessageAsync("", false, logMessage); } if (Config.sheetsEnabled) { DiscordMember user = null; try { user = await command.Guild.GetMemberAsync(ticket.creatorID); } catch (NotFoundException) { } Sheets.DeleteTicketQueued(ticket.id); Sheets.AddTicketQueued(user, command.Channel, ticket.id.ToString(), staffMember.Id.ToString(), staffMember.DisplayName, ticket.createdTime, null, ticket.summary); } }