public async Task Rank() { OliveGuild guild = OliveGuild.Get(Context.Guild.Id); List <string> userIds = Context.Guild.Users.Select(u => u.Id.ToString()).ToList(); var users = guild.Levels.Where(u => userIds.Contains(u.Key)).ToList(); users.Sort((u1, u2) => u1.Value.Level == u2.Value.Level ? u2.Value.Xp.CompareTo(u1.Value.Xp) : u2.Value.Level.CompareTo(u1.Value.Level)); var rankUser = new List <KeyValuePair <string, OliveGuild.UserLevel> >(users); if (rankUser.Count > 5) { rankUser = rankUser.GetRange(0, 5); } EmbedBuilder emb = Context.CreateEmbed(title: "순위"); for (int i = 0; i < rankUser.Count; i++) { emb.AddField($"{i + 1}위: {rankUser[i].Value.Level}/{rankUser[i].Value.Xp}", $"{Context.Guild.GetUser(ulong.Parse(rankUser[i].Key)).Mention}"); } if (users.Any(u => u.Key == Context.User.Id.ToString()) && !rankUser.Any(u => u.Key == Context.User.Id.ToString())) { var u = users.Where(u => u.Key == Context.User.Id.ToString()).First(); emb.AddField($"{users.IndexOf(u) + 1}위: {u.Value.Level}/{u.Value.Xp}", $"{Context.Guild.GetUser(ulong.Parse(u.Key)).Mention}"); } await Context.MsgReplyEmbedAsync(emb.Build()); }
public async Task Disable([Name("카테고리")] string category) { if (!CategoryNames.Contains(category)) { await Context.MsgReplyEmbedAsync($"알 수 없는 카테고리에요\n{string.Join(", ", CategoryNames.Select(c => $"`{c}`"))} 중 하나를 선택할 수 있어요"); return; } OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; CategoryType cat = StringToCategory(category); if (cat == CategoryType.Setting) { await Context.MsgReplyEmbedAsync($"비활성화 할 수 없는 카테고리에요"); return; } if (!setting.EnabledCategories.Contains(cat)) { await Context.MsgReplyEmbedAsync($"이미 비활성화돼있는 카테고리에요"); return; } setting.EnabledCategories.Remove(cat); OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"{category} 카테고리를 비활성화했어요"); }
public async Task SeeLevel([Remainder, Name("유저")] SocketGuildUser user = null) { if (user == null) { user = Context.User as SocketGuildUser; } OliveGuild guild = OliveGuild.Get(Context.Guild.Id); string UserId = user.Id.ToString(); if (!guild.Levels.ContainsKey(UserId)) { guild.Levels.Add(UserId, new OliveGuild.UserLevel()); OliveGuild.Set(Context.Guild.Id, g => g.Levels, guild.Levels); } EmbedBuilder emb = Context.CreateEmbed(title: $"{user.GetName(false)}님의 레벨"); emb.AddField("level", guild.Levels[UserId].Level, true); emb.AddField("xp", guild.Levels[UserId].Xp, true); int totalXp = Utility.GetLevelXp(guild.Levels[UserId].Level); emb.AddField($"레벨업까지 남은 xp: {totalXp - guild.Levels[UserId].Xp}", $"{guild.Levels[UserId].Xp} [{new string(Enumerable.Repeat('■', (int)Math.Round(guild.Levels[UserId].Xp / (float)totalXp * 10)).ToArray())}{new string(Enumerable.Repeat('□', (int)Math.Round((totalXp - guild.Levels[UserId].Xp) / (float)totalXp * 10)).ToArray())}] {totalXp}"); await Context.MsgReplyEmbedAsync(emb.Build()); }
public async Task SetLevelUpChannel([Remainder, Name("채널")] SocketTextChannel channel) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; setting.LevelUpChannelId = channel.Id; OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"이제 레벨업 메시지가 {channel.Mention} 채널에 보내져요"); }
public async Task SetLogChannel([Remainder, Name("채널")] SocketTextChannel channel) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; setting.LogChannelId = channel.Id; OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"로그 채널을 {channel.Name.으로()} 설정했어요"); }
public async Task SeeLevelUpChannel() { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; EmbedBuilder emb = Context.CreateEmbed(title: "레벨 설정"); if (setting.LevelUpChannelId.HasValue && Context.Guild.Channels.Any(c => c.Id == setting.LevelUpChannelId.Value)) { emb.AddField("레벨업 채널", Context.Guild.GetTextChannel(setting.LevelUpChannelId.Value).Mention); } else { emb.AddField("레벨업 채널", "레벨업 채널이 설정되지 않았어요"); } List <ulong> cnl = setting.NonXpChannels.Where(c => Context.Guild.Channels.Any(cc => cc.Id == c)).ToList(); if (setting.NonXpChannels.Count > 0) { string s = ""; foreach (var value in cnl) { s += $"{Context.Guild.GetTextChannel(value).Mention}\n"; } emb.AddField("레벨업 불가 채널", s); } else { emb.AddField("레벨업 불가 채널", "설정된 레벨업 불가 채널이 없어요"); } var roles = setting.LevelRoles.Where(lr => Context.Guild.Roles.Any(r => r.Id == lr.Value)).ToList(); if (roles.Count > 0) { string s = ""; foreach (var value in roles) { s += $"{value.Key} 레벨: {Context.Guild.GetRole(value.Value).Mention}\n"; } emb.AddField("레벨 역할", s); } else { emb.AddField("레벨 역할", "설정된 레벨 역할이 없어요"); } await Context.MsgReplyEmbedAsync(emb.Build()); }
public async Task SeeEnabledCategories() { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; EmbedBuilder emb = Context.CreateEmbed(title: "카테고리 활성화 확인"); foreach (CategoryType cat in Enum.GetValues(typeof(CategoryType))) { emb.AddField(CategoryToString(cat), setting.EnabledCategories.Contains(cat).ToEmoji(), true); } await Context.MsgReplyEmbedAsync(emb.Build()); }
private static async Task OnMessageDeleted(Cacheable <IMessage, ulong> cache, ISocketMessageChannel channel) { if (channel.GetType() != typeof(SocketTextChannel)) { return; } SocketGuild guild = ((SocketTextChannel)channel).Guild; OliveGuild.GuildSetting setting = OliveGuild.Get(guild.Id).Setting; if (!setting.EnabledCategories.Contains(RequireCategoryEnable.CategoryType.Log) || !setting.LogChannelId.HasValue) { return; } SocketTextChannel c = guild.GetTextChannel(setting.LogChannelId.Value); EmbedBuilder emb = new EmbedBuilder { Title = "메시지 삭제", Color = new Color(255, 0, 0), Description = $"<#{channel.Id}> 채널에서 메시지({cache.Id})가 삭제됐어요\n", Timestamp = DateTimeOffset.Now.ToKST() }; if (cache.HasValue) { emb.WithAuthor($"{cache.Value.Author.Username}#{cache.Value.Author.Discriminator} ({cache.Value.Author.Id})", cache.Value.Author.GetAvatar()); if (string.IsNullOrWhiteSpace(cache.Value.Content)) { emb.Description += "\n내용이 비어있어요"; } else { emb.AddField("내용", cache.Value.Content.Slice(512, out bool isApplied), true); if (isApplied) { await c.SendFileAsync(cache.Value.Content.ToStream(), "before.txt", ""); } } } else { emb.WithAuthor("알 수 없음"); emb.Description += "\n내용이 캐시에 저장되지 않았어요"; } await c.SendMessageAsync(embed : emb.Build()); }
public async Task AddLevelRole([Name("레벨")] int level, [Remainder, Name("역할")] SocketRole role) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; if (setting.LevelRoles.ContainsKey(level.ToString())) { await Context.MsgReplyEmbedAsync("해당 레벨의 역할이 이미 설정돼있어요"); return; } setting.LevelRoles.Add(level.ToString(), role.Id); OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"이제 {level} 레벨이 되면 {role.Mention} 역할을 얻을 수 있어요"); }
public async Task RemoveNonXpChannel([Name("채널")] SocketTextChannel channel) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; if (!setting.NonXpChannels.Contains(channel.Id)) { await Context.MsgReplyEmbedAsync("해당 채널은 레벨업 불가 채널이 아니에요"); return; } setting.NonXpChannels.Remove(channel.Id); OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"이제 {channel.Mention}에서 메시지를 보내면 xp가 올라요"); }
public async Task AddNonXpChannel([Name("채널")] SocketTextChannel channel) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; if (setting.NonXpChannels.Contains(channel.Id)) { await Context.MsgReplyEmbedAsync("해당 채널은 이미 레벨업 불가 채널이에요"); return; } setting.NonXpChannels.Add(channel.Id); OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"이제 {channel.Mention} 채널에서는 xp가 오르지 않아요"); }
public async Task ResetLevelUpChannel() { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; if (!setting.LevelUpChannelId.HasValue) { await Context.MsgReplyEmbedAsync("레벨업 채널이 설정되지 않아서 초기화 할 수 없어요"); return; } setting.LevelUpChannelId = null; OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"레벨업 채널을 초기화했어요"); }
public async Task RemoveLevelRole([Name("레벨")] int level) { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; if (!setting.LevelRoles.ContainsKey(level.ToString())) { await Context.MsgReplyEmbedAsync("해당 레벨에 설정된 역할이 없어요"); return; } setting.LevelRoles.Remove(level.ToString()); OliveGuild.Set(Context.Guild.Id, g => g.Setting, setting); await Context.MsgReplyEmbedAsync($"{level} 레벨의 역할을 제거했어요"); }
public async Task SeeLogChannel() { OliveGuild.GuildSetting setting = OliveGuild.Get(Context.Guild.Id).Setting; EmbedBuilder emb = Context.CreateEmbed(title: "로그 채널"); ulong?id = setting.LogChannelId; if (!id.HasValue || !Context.Guild.Channels.Any(c => c.Id == id)) { emb.Description = "로그 채널이 설정되지 않았어요"; } else { emb.Description = $"현재 로그 채널은 {Context.Guild.GetTextChannel(id.Value).Name.이()}에요"; } await Context.MsgReplyEmbedAsync(emb.Build()); }
public static async Task OnMessageReceived(SocketMessage msg) { if (msg is not SocketUserMessage userMsg || userMsg.Content == null || userMsg.Author.Id == Program.Client.CurrentUser.Id || userMsg.Author.IsBot) { return; } SocketCommandContext context = new SocketCommandContext(Program.Client, userMsg); if (await Games.WordRelay(context)) { return; } if (await Games.TypingGame(context)) { return; } int argPos = 0; if (userMsg.HasStringPrefix(prefix, ref argPos) || userMsg.HasMentionPrefix(Program.Client.CurrentUser, ref argPos)) { await Program.Command.ExecuteAsync(context, argPos, Program.Service); } if (context.IsPrivate) { return; } OliveGuild guild = OliveGuild.Get(context.Guild.Id); if (!guild.Setting.EnabledCategories.Contains(RequireCategoryEnable.CategoryType.Level)) { return; } if (guild.Setting.NonXpChannels.Contains(context.Channel.Id)) { return; } string UserId = context.User.Id.ToString(); if (guild.Levels.ContainsKey(UserId)) { guild.Levels[UserId].Xp++; if (guild.Levels[UserId].Xp >= Utility.GetLevelXp(guild.Levels[UserId].Level)) { guild.Levels[UserId].Level++; guild.Levels[UserId].Xp = 0; string lv = guild.Levels[UserId].Level.ToString(); if (guild.Setting.LevelUpChannelId.HasValue && context.Guild.Channels.Any(c => c.Id == guild.Setting.LevelUpChannelId.Value)) { SocketTextChannel c = context.Guild.GetTextChannel(guild.Setting.LevelUpChannelId.Value); await c.SendMessageAsync($"{context.User.Mention}님, {lv}레벨이 되신걸 축하해요! :tada:"); } else { await context.MsgReplyEmbedAsync($"{context.User.Mention}님, {lv}레벨이 되신걸 축하해요! :tada:", disalbeMention : false); } if (guild.Setting.LevelRoles.ContainsKey(lv) && context.Guild.Roles.Any(r => r.Id == guild.Setting.LevelRoles[lv])) { await(context.User as SocketGuildUser).AddRoleAsync(context.Guild.GetRole(guild.Setting.LevelRoles[lv])); } } } else { guild.Levels.Add(UserId, new OliveGuild.UserLevel()); guild.Levels[UserId].Xp++; } OliveGuild.Set(context.Guild.Id, g => g.Levels, guild.Levels); }
public static async Task OnMessageUpdated(Cacheable <IMessage, ulong> cache, SocketMessage msg, ISocketMessageChannel channel) { if (channel.GetType() != typeof(SocketTextChannel)) { return; } SocketGuild guild = ((SocketTextChannel)channel).Guild; OliveGuild.GuildSetting setting = OliveGuild.Get(guild.Id).Setting; if (!setting.EnabledCategories.Contains(RequireCategoryEnable.CategoryType.Log) || !setting.LogChannelId.HasValue) { return; } SocketTextChannel c = guild.GetTextChannel(setting.LogChannelId.Value); EmbedBuilder emb = new EmbedBuilder { Title = "메시지 수정", Color = new Color(255, 255, 0), Description = $"<#{channel.Id}> 채널에서 [메시지]({msg.GetJumpUrl()})가 수정됐어요\n", Timestamp = DateTimeOffset.Now.ToKST() }; emb.WithAuthor(msg.Author); if (cache.HasValue) { if (cache.Value.Content == msg.Content) { return; } if (string.IsNullOrWhiteSpace(cache.Value.Content)) { emb.Description += "\n수정 전 내용이 비어있어요"; } else { emb.AddField("수정 전 내용", cache.Value.Content.Slice(512, out bool isApplied), true); if (isApplied) { await c.SendFileAsync(msg.Content.ToStream(), "before.txt", ""); } } } else { emb.Description += "\n수정 전 내용은 캐시에 저장되지 않았어요"; } if (string.IsNullOrWhiteSpace(msg.Content)) { emb.Description += "\n수정 후 내용이 비어있어요"; } else { emb.AddField("수정 후 내용", msg.Content.Slice(512, out bool isApplied), true); if (isApplied) { await c.SendFileAsync(msg.Content.ToStream(), "after.txt", ""); } } await c.SendMessageAsync(embed : emb.Build()); }