/// <summary> /// Changes a guilds color /// </summary> /// <param name="guild">Guild to update</param> /// <param name="newColor">New color to apply</param> /// <returns>true, if operation succeeds</returns> public static async Task <bool> UpdateGuildColorAsync(MinecraftGuild guild, GuildColor newColor) { string errorhint = "Modifying Guild Role"; try { if (BotCore.Client.TryGetRole(guild.RoleId, out SocketRole guildRole)) { await guildRole.ModifyAsync(RoleProperties => { RoleProperties.Color = MinecraftGuild.ToDiscordColor(newColor); }); errorhint = "Setting Guild Color"; guild.Color = newColor; errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Change color of guild \"{guild.Name}\" to \"{newColor}\" ingame", $"Color: `{ newColor}` (`0x{ ((uint)newColor).ToString("X")}`)"); return(true); } else { return(false); } } catch (Exception e) { await GuildChannelHelper.SendExceptionNotification(e, $"Error recoloring guild {guild.Name} to {newColor}. Hint: {errorhint}"); return(false); } }
/// <summary> /// Adds a member to a guild /// </summary> /// <param name="guild">Guild the new member joins</param> /// <param name="newMember">New member that joins the guild</param> /// <returns>true, if operation succeeds</returns> public static async Task <bool> MemberJoinGuildAsync(MinecraftGuild guild, SocketGuildUser newMember) { string errorhint = "Adding Guild Role"; try { if (BotCore.Client.TryGetRole(guild.RoleId, out SocketRole guildRole) && !guild.MemberIds.Contains(newMember.Id)) { await newMember.AddRoleAsync(guildRole); errorhint = "Adding Member to Guild and Saving"; guild.MemberIds.Add(newMember.Id); await SaveAll(); errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Add user \"{newMember}\" to guild \"{guild.Name}\" ingame", "Joining User: "******"Error joining player {newMember?.Mention} to guild {guild?.Name}. Hint: {errorhint}"); return(false); } }
/// <summary> /// Handles a mention event /// </summary> /// <param name="user">The user who sent the mentioning message</param> /// <param name="messageEMs">Amount of EMs inside that message</param> private static async Task HandleMention(SocketGuildUser user, int messageEMs) { bool firstInfraction = true; int totalEMs = messageEMs; List <MentionEvent> removeEvents = new List <MentionEvent>(); foreach (MentionEvent oldEvent in MentionEvents) { if (!oldEvent.IsValid) { removeEvents.Add(oldEvent); continue; } if (oldEvent.UserId == user.Id) { firstInfraction = false; totalEMs += oldEvent.EffectiveMentions; } } foreach (MentionEvent removeEvent in removeEvents) { MentionEvents.Remove(removeEvent); } MentionEvent mentionEvent = new MentionEvent(user.Id, messageEMs); MentionEvents.Add(mentionEvent); if (totalEMs >= EM_MUTE_LIMIT && !firstInfraction) { UserModerationLog userModLog = GuildModerationLog.GetOrCreateUserModerationLog(user.Guild.Id, user.Id, out GuildModerationLog guildModLog); await userModLog.AddMute(user, DateTimeOffset.MaxValue, null); IDMChannel dmChannel = await user.GetOrCreateDMChannelAsync(); await dmChannel.SendMessageAsync(embed : MuteEmbed.Build()); await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Muted User {user} for exceeding the EM limits", $"User: {user.Mention}\nEffective Mentions: `{totalEMs}/{EM_MUTE_LIMIT}`"); } else if (totalEMs >= EM_WARNING_LIMIT) { // Handle Warning IDMChannel dmChannel = await user.GetOrCreateDMChannelAsync(); await dmChannel.SendMessageAsync(embed : WarningEmbed.Build()); } }
private static async Task Client_UserLeft(SocketGuildUser user) { if (MinecraftGuildModel.TryGetGuildOfUser(user.Id, out MinecraftGuild userGuild)) { GuildRank rank = userGuild.GetMemberRank(user.Id); if (rank == GuildRank.Captain) { await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Guild Captain left Server", $"Guild: `{userGuild.Name}`\nCaptain: `{user}`, Id: `{user.Id}`{(string.IsNullOrEmpty(user.Nickname) ? "" : $", Nickname: `{user.Nickname}`")}"); } else { userGuild.MemberIds.Remove(user.Id); userGuild.MateIds.Remove(user.Id); await MinecraftGuildModel.SaveAll(); } } BotVarCollection guildBotVars = BotVarManager.GetGuildBotVarCollection(user.Guild.Id); if (guildBotVars.TryGetBotVar(Var.MinecraftBranchRoleBotVarId, out ulong minecraftBranchRole)) { if (user.Roles.Any(role => { return(role.Id == minecraftBranchRole); })) { await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Minecraft Branch Member left Server", $"Name: `{user}`, Id: `{user.Id}`{(string.IsNullOrEmpty(user.Nickname) ? "" : $", Nickname: `{user.Nickname}`")}"); } } if (TryGetLogChannel(user.Guild, DiscordEventType.UserLeft, out SocketTextChannel channel, out EmbedBuilder embed)) { embed.Title = $"{user} left"; StringBuilder description = new StringBuilder(); if (!string.IsNullOrEmpty(user.Nickname)) { description.AppendLine($"**Nickname**: \"{user.Nickname}\""); } if (user.Roles.Count > 1) { description.AppendLine($"**Roles**: `{string.Join(", ", user.Roles)}`"); } embed.ThumbnailUrl = user.GetDefaultAvatarUrl(); embed.Description = description.ToString(); await channel.SendEmbedAsync(embed); } }
/// <summary> /// Deletes a guild both on server and in data /// </summary> /// <param name="minecraftGuild">Guild to remove</param> /// <returns>True, if operation completed</returns> public static async Task <bool> DeleteGuildAsync(SocketGuild discordGuild, MinecraftGuild minecraftGuild) { string errorhint = "Removing Guild Role"; try { SocketRole guildRole = discordGuild.GetRole(minecraftGuild.RoleId); SocketRole captainRole = discordGuild.GetRole(SettingsModel.GuildCaptainRole); if (guildRole != null) { await guildRole.DeleteAsync(); } errorhint = "Removing captain role from captain"; SocketGuildUser captain = discordGuild.GetUser(minecraftGuild.CaptainId); if (captain != null && captainRole != null) { if (captain.Roles.Any(item => { return(item.Id == captainRole.Id); })) { await captain.RemoveRoleAsync(captainRole); } } errorhint = "Removing Guild Channel"; if (GuildChannelHelper.TryGetChannel(minecraftGuild.ChannelId, out SocketTextChannel guildChannel)) { await guildChannel.DeleteAsync(); } errorhint = "Removing Guild and Saving"; await DeleteGuildDatasetAsync(minecraftGuild); errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Remove ingame represantation of guild\"{minecraftGuild.Name}\"", string.Empty); return(true); } catch (Exception e) { await GuildChannelHelper.SendExceptionNotification(e, $"Error removing guild {minecraftGuild.Name}. Hint: {errorhint}"); return(false); } }
/// <summary> /// Changes a guilds name /// </summary> /// <param name="guild">Guild to modify</param> /// <param name="newName">New name for the guild</param> /// <returns>true, if operation succeeds</returns> public static async Task <bool> UpdateGuildNameAsync(MinecraftGuild guild, string newName) { string errorhint = "Modifying Guild Channel"; try { if (GuildChannelHelper.TryGetChannel(guild.ChannelId, out SocketTextChannel guildChannel) && BotCore.Client.TryGetRole(guild.RoleId, out SocketRole guildRole)) { await guildChannel.ModifyAsync(GuildChannelProperties => { GuildChannelProperties.Name = newName; GuildChannelProperties.Topic = "Private Guild Channel for " + newName; }); errorhint = "Modifying Guild Role"; await guildRole.ModifyAsync(RoleProperties => { RoleProperties.Name = newName; }); errorhint = "Setting Guild Name"; string oldname = guild.Name; guild.Name = newName; errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Rename guild \"{oldname}\" to \"{newName}\" ingame", string.Empty); return(true); } else { return(false); } } catch (Exception e) { await GuildChannelHelper.SendExceptionNotification(e, $"Error renaming guild {guild.Name} to {newName}. Hint: {errorhint}"); return(false); } }
/// <summary> /// Removes a member from a guild /// </summary> /// <param name="guild">Guild the member leaves</param> /// <param name="leavingMember">Member that leaves</param> /// <returns>true, if operation succeeds</returns> public static async Task <bool> MemberLeaveGuildAsync(MinecraftGuild guild, SocketGuildUser leavingMember) { string errorhint = "Removing Guild Role"; try { if (guild.MemberIds.Contains(leavingMember.Id) || guild.MateIds.Contains(leavingMember.Id)) { foreach (SocketRole role in leavingMember.Roles) { if (role.Id == guild.RoleId) { await leavingMember.RemoveRoleAsync(role); break; } } errorhint = "Removing Member from Guild and Saving"; guild.MemberIds.Remove(leavingMember.Id); guild.MateIds.Remove(leavingMember.Id); await SaveAll(); errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Remove user \"{leavingMember}\" from guild \"{guild.Name}\" ingame", "Leaving User: "******"Error leaving player {leavingMember?.Mention} from guild {guild.Name}. Hint: {errorhint}"); return(false); } }
/// <summary> /// Creates a new guild (includes role, channel, etc) /// </summary> /// <param name="guild">Discord Server Guild to create channel and role on</param> /// <param name="name">Guild Name</param> /// <param name="color">Guild Display Color</param> /// <param name="captain">Guild Captain</param> /// <param name="members">Guild Users</param> /// <returns>true, if operation succeeds</returns> public static async Task <bool> CreateGuildAsync(SocketGuild guild, string name, GuildColor color, SocketGuildUser captain, List <SocketGuildUser> members) { string errorhint = "Failed a precheck"; try { if (TryGetGuildOfUser(captain.Id, out MinecraftGuild existingCaptainGuild)) { if (existingCaptainGuild.Active || captain.Id == existingCaptainGuild.CaptainId) { errorhint = "Precheck failed on " + captain.Mention; return(false); } else { existingCaptainGuild.MateIds.Remove(captain.Id); existingCaptainGuild.MemberIds.Remove(captain.Id); } } foreach (SocketGuildUser member in members) { if (TryGetGuildOfUser(member.Id, out MinecraftGuild existingMemberGuild)) { if (existingCaptainGuild.Active || member.Id == existingCaptainGuild.CaptainId) { return(false); } else { errorhint = "Precheck failed on " + member.Mention; existingCaptainGuild.MateIds.Remove(member.Id); existingCaptainGuild.MemberIds.Remove(member.Id); } } } errorhint = "Failed to create Guild Role!"; RestRole guildRole = await guild.CreateRoleAsync(name, color : MinecraftGuild.ToDiscordColor(color), isHoisted : true); errorhint = "Move role into position"; await guildRole.ModifyAsync(RoleProperties => { RoleProperties.Position = GUILD_ROLE_POSITION; }); errorhint = "Failed to create Guild Channel!"; SocketCategoryChannel guildCategory = guild.GetChannel(GuildChannelHelper.GuildCategoryId) as SocketCategoryChannel; if (guildCategory == null) { throw new Exception("Could not find Guild Category Channel!"); } RestTextChannel guildChannel = await guild.CreateTextChannelAsync(name, TextChannelProperties => { TextChannelProperties.CategoryId = GuildChannelHelper.GuildCategoryId; TextChannelProperties.Topic = "Private Guild Channel for " + name; }); errorhint = "Failed to copy guildcategories permissions"; foreach (Overwrite overwrite in guildCategory.PermissionOverwrites) { IRole role = guild.GetRole(overwrite.TargetId); if (role != null) { await guildChannel.AddPermissionOverwriteAsync(role, overwrite.Permissions); } } errorhint = "Failed to set Guild Channel Permissions!"; await guildChannel.AddPermissionOverwriteAsync(guildRole, GuildRoleChannelPerms); await guildChannel.AddPermissionOverwriteAsync(captain, CaptainChannelPerms); errorhint = "Failed to add Guild Role to Captain!"; await captain.AddRoleAsync(guildRole); errorhint = "Failed to add GuildCaptain Role to Captain!"; SocketRole captainRole = guild.GetRole(SettingsModel.GuildCaptainRole); if (captainRole != null) { await captain.AddRoleAsync(captainRole); } errorhint = "Failed to add Guild Role to a Member!"; foreach (SocketGuildUser member in members) { await member.AddRoleAsync(guildRole); } errorhint = "Failed to create MinecraftGuild!"; StringBuilder memberPingString = new StringBuilder(); MinecraftGuild minecraftGuild = new MinecraftGuild(guildChannel.Id, guildRole.Id, color, name, captain.Id); for (int i = 0; i < members.Count; i++) { SocketGuildUser member = members[i]; minecraftGuild.MemberIds.Add(member.Id); memberPingString.Append(member.Mention); if (i < members.Count - 1) { memberPingString.Append(", "); } } guilds.Add(minecraftGuild); errorhint = "Failed to save MinecraftGuild!"; await SaveAll(); errorhint = "Failed to send or pin guild info embed"; var infomessage = await guildChannel.SendMessageAsync(embed : GuildHelpEmbed.Build()); await infomessage.PinAsync(); errorhint = "Notify Admins"; await AdminTaskInteractiveMessage.CreateAdminTaskMessage($"Create ingame represantation for guild \"{name}\"", $"Name: `{name}`, Color: `{color}` (`0x{((uint)color).ToString("X")}`)\nCaptain: {captain.Mention}\nMembers: {memberPingString}"); return(true); } catch (Exception e) { await GuildChannelHelper.SendExceptionNotification(e, $"Error creating guild {name}. Hint: {errorhint}"); return(false); } }