public static void RegisterRemoveBaseNoteCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Remove Enemy Note") .Description("!remove enemy note [base number] - remove the note from the enemy war base.") .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Base", ParameterType.Required) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); War curWar = new War(); curWar = (from w in dc.Wars orderby w.Date descending select w).Take(1).SingleOrDefault(); EnemyBase eb = new EnemyBase(); eb = (from b in dc.EnemyBases where b.WarID == curWar.WarID && b.EnemyBaseNo.ToString() == e.GetArg("Base") select b).SingleOrDefault(); eb.Notes = null; dc.SubmitChanges(); await e.Channel.SendMessage("NOTE REMOVED FROM ENEMY BASE #" + e.GetArg("Base")); } catch (Exception ex) { discord.Log.Error("RegisterRemoveBaseNoteCommand", ex.Message); } }); }
public static void RegisterGetPlayerCurSeasonAttendanceCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Season Attendance") .Description("!season attendance <'name'> - get yours or another members war attendace for the current season.") .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Member", ParameterType.Optional) .Do(async(e) => { try { string player = string.Empty; if (e.GetArg("Member") == null || e.GetArg("Member") == "") { player = e.User.Name; } else { player = e.GetArg("Member"); } ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); tvfGetCurSeasonAttendanceResult res = new tvfGetCurSeasonAttendanceResult(); res = (from att in dc.tvfGetCurSeasonAttendance(player) select att).FirstOrDefault(); await e.Channel.SendMessage(player.ToUpper() + "'S SEASON WAR ATTENDANCE: " + res.Attendance + "% (" + res.Attended + "/" + res.Totalwars + ")"); } catch (Exception ex) { discord.Log.Error("RegisterGetPlayerAttendanceCommand", ex.Message); } }); }
public static void RegisterGetClaimedBasesCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Claimed") .Description("!claimed - get a list of claimed war bases.") .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "***CLAIMED WAR BASES*** \n"; foreach (EnemyBasesView eb in res) { if (eb.CLAIMED_BY != null && eb.CLAIMED_BY != "") { TimeSpan t = TimeSpan.FromSeconds((int)eb.DATETIME); string timepassed = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", t.Hours, t.Minutes, t.Seconds); message += "```#" + eb.BASE__ + (((int)eb.BASE__ < 10) ? " | CLAIMED BY: " : " | CLAIMED BY: ") + eb.CLAIMED_BY + " | CLAIMED FOR: " + timepassed + "\n" + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "```"; } } message += ""; await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } }); }
public static void RegisterDisplayEnemyBaseNotes(CommandService commands, DiscordClient discord) { commands.CreateCommand("Display Base Notes") .Description("!display base notes - show all enemy base notes") .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "ENEMY BASE NOTES: \n"; foreach (EnemyBasesView eb in res) { if (eb.NOTES != null && eb.NOTES != "") { message += "BASE: #" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | NOT CLAIMED" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + ((eb.NOTES == null) ? "" : (" | NOTES: " + eb.NOTES)) + "\n"; } } await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterDisplayEnemyBaseNotes", ex.Message); } }); }
public static void RegisterSearchCommands(CommandService commands, DiscordClient discord) { commands.CreateGroup("search", cgb => { cgb.Category("=== SEARCH COMMANDS ==="); cgb.CreateCommand("members") .Description("!search members ['name'] - search for members/ex-members.") .Alias(new string[] { "-m", "-mem", "member" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Member", ParameterType.Required) .Do(async(e) => { #region search members try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <MemberRank> res = new List <MemberRank>(); res = (from u in dc.Users join ir in dc.UsersInRoles on u.UserId equals ir.UserId join r in dc.Roles on ir.RoleId equals r.RoleId where u.UserName.Contains(e.GetArg("Member")) select new MemberRank { userName = u.UserName, userRole = r.RoleName }).ToList(); if (res.Count < 1) { await e.Channel.SendMessage("NO USERS FOUND THAT MATCH YOUR SEARCH CRITERIA!"); } else { string message = "MEMBERS: \n"; foreach (MemberRank u in res) { if (u.userName != null && u.userName != "") { message += u.userName + "(" + u.userRole + ")\n"; } } if (message.Length <= 2000) { await e.Channel.SendMessage(message); } else { await e.Channel.SendMessage(res.Count() + " USERS FOUND... PLEASE REFINE MEMBER SEARCH!"); } } } catch (Exception ex) { discord.Log.Error("RegisterSearchMembersCommand", ex.Message); } #endregion }); }); }
public static void RegisterListWarningsCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Warnings") .Description("!warnings - list all member warnings.") .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { try { string message = "**MEMBER WARNINGS** \n"; ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <Warning> warnings = new List <Warning>(); warnings = (from w in dc.Warnings select w).ToList(); message += "```"; foreach (Warning w in warnings) { message += "| " + w.WarningName + " = " + w.WarningDescription + " "; } message += "|``` ```"; foreach (Warning w in warnings) { message += "" + w.WarningName + ": "; List <UserWarning> userwarnings = new List <UserWarning>(); userwarnings = (from uw in dc.UserWarnings where uw.WarningId == w.WarningId select uw).Distinct().ToList(); userwarnings = userwarnings .GroupBy(uw => uw.UserId) .Select(g => g.First()) .ToList(); foreach (UserWarning uw in userwarnings) { User user = (from u in dc.Users where u.UserId == uw.UserId select u).FirstOrDefault(); int count = (from uwCount in dc.UserWarnings where uwCount.UserId == user.UserId && uwCount.WarningId == w.WarningId select uwCount).Count(); message += user.UserName + "(" + count + "), "; } message += "\n"; } message += "```"; await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } }); }
public static async Task LogWarNews(string msg, DateTime eventTime, string userName) { await Task.Delay(500); ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); WarNew newNews = new WarNew(); newNews.NewsID = Guid.NewGuid(); newNews.News = msg; newNews.PostDateTime = eventTime; newNews.UserName = userName; try { dc.WarNews.InsertOnSubmit(newNews); dc.SubmitChanges(); } catch (Exception ex) { throw ex; } }
public static void RegisterPlayerWarningCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Add Warning") .Description("!add warning [name] [warning] - add a player warning!") .AddCheck((command, user, channel) => !user.IsBot) .AddCheck((command, user, channel) => user.Roles.FirstOrDefault().Name == "@Co-Leader") .Parameter("name", ParameterType.Required) .Parameter("warning", ParameterType.Required) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.UserName.ToLower().Equals(e.GetArg(0).ToLower()) select u).First(); if (user != null) { Warning warning = (from w in dc.Warnings where w.WarningName.ToUpper() == e.GetArg(1).ToUpper() select w).First(); if (warning != null) { UserWarning uw = new UserWarning { UserId = user.UserId, WarningId = warning.WarningId, WarningDateTime = DateTime.UtcNow }; dc.UserWarnings.InsertOnSubmit(uw); dc.SubmitChanges(); await e.Channel.SendMessage(warning.WarningName + " WARNING ADDED TO " + e.GetArg(0).ToUpper()); } else { await e.Channel.SendMessage(e.GetArg(1).ToUpper() + " IS NOT A VALID WARNING CODE!"); } } else { await e.Channel.SendMessage(e.GetArg(0).ToUpper() + " NOT FOUND!"); } } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } }); }
public static void RegisterDisplayWarInfoCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("War Info") .Description("!war info - list all war bases.") .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "WAR INFO: \n"; //res = res.OrderBy(o => o.STARS).ThenBy(o => o.DAMAGE).ThenByDescending(o => o.BASE__).ToList(); foreach (EnemyBasesView eb in res) { if (eb.STARS == 3) { message += "`#" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | FLAT" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "`\n"; } else { message += "`#" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | FREE" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "`\n"; } } await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterDisplayWarInfoCommand", ex.Message); } }); }
public static void RegisterRemovePlayerWarningCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Remove Warning") .Description("!remove warning [name] - remove players last warning!") .AddCheck((command, user, channel) => !user.IsBot) .AddCheck((command, user, channel) => user.Roles.FirstOrDefault().Name == "@Co-Leader") .Parameter("name", ParameterType.Required) .Do(async(e) => { try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.UserName.ToLower().Contains(e.GetArg(0).ToLower()) select u).First(); if (user != null) { UserWarning uw = (from warning in dc.UserWarnings where warning.UserId == user.UserId orderby warning.WarningDateTime descending select warning).First(); if (uw != null) { dc.UserWarnings.DeleteOnSubmit(uw); dc.SubmitChanges(); string warning = (from w in dc.Warnings where w.WarningId == uw.WarningId select w.WarningName).ToString(); await e.Channel.SendMessage(warning.ToUpper() + " WARNING REMOVED FROM " + e.GetArg(0).ToUpper()); } else { await e.Channel.SendMessage("NO WARNINGS NOT FOUND FOR " + e.GetArg(0).ToUpper() + "!"); } } else { await e.Channel.SendMessage(e.GetArg(0).ToUpper() + " NOT FOUND!"); } await e.Channel.SendMessage("WARING LOGGED AGAINST " + e.GetArg(0).ToUpper()); } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } }); }
public static void RegisterBaseCheckCommand(CommandService commands, DiscordClient discord) { commands.CreateCommand("Enemy") .Description("!enemy [base number] - show details of the requested war base.") .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Base", ParameterType.Required) .Do(async(e) => { bool sucess = false; try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); EnemyBasesView ebv = new EnemyBasesView(); ebv = (from eb in dc.EnemyBasesViews where eb.BASE__.Equals(e.GetArg("Base")) select eb).FirstOrDefault(); if (ebv == null) { await e.Channel.SendMessage("INVALID BASE NUMBER OR NO WAR IN PROGRESS"); } else { await e.Channel.SendMessage("BASE: #" + ebv.BASE__ + ((ebv.CLAIMED_BY == null) ? " | NOT CLAIMED" : " | CLAIMED BY: " + ebv.CLAIMED_BY) + ((ebv.ATTACKS == 0) ? "" : (" | ATTACKS: " + ebv.ATTACKS + " | BEST ATTACK: " + ebv.BEST + " | STARS: " + ebv.STARS + " | DAMAGE: " + ebv.DAMAGE + "%")) + ((ebv.NOTES == null) ? "" : (" | NOTES: " + ebv.NOTES))); } sucess = true; } catch (Exception ex) { sucess = false; throw ex; } if (!sucess) { await e.Channel.SendMessage("THAT COMMAND IS NOT AVAILABLE RIGHT NOW!"); } }); }
public static void RegisterWarCommands(CommandService commands, DiscordClient discord) { commands.CreateGroup("war", cgb => { cgb.Category("=== WAR COMMANDS ==="); cgb.CreateCommand("info") .Description("!war info - list all war bases.") .Alias(new string[] { "-i", "" }) .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { #region war info try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "WAR INFO: \n"; foreach (EnemyBasesView eb in res) { if (eb.STARS == 3) { message += "`#" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | FLAT" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "`\n"; } else { message += "`#" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | FREE" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "`\n"; } } await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterDisplayWarInfoCommand", ex.Message); } #endregion }); cgb.CreateCommand("claimed") .Description("!war claimed - get a list of claimed war bases.") .Alias(new string[] { "-c" }) .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { #region war claimed bases try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "**CLAIMED WAR BASES** \n"; foreach (EnemyBasesView eb in res) { if (eb.CLAIMED_BY != null && eb.CLAIMED_BY != "") { TimeSpan t = TimeSpan.FromSeconds((int)eb.DATETIME); string timepassed = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", t.Hours, t.Minutes, t.Seconds); message += "```#" + eb.BASE__ + (((int)eb.BASE__ < 10) ? " | CLAIMED BY: " : " | CLAIMED BY: ") + eb.CLAIMED_BY + " | CLAIMED FOR: " + timepassed + "\n" + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + "```"; } } message += ""; await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } #endregion }); cgb.CreateCommand("enemy") .Description("!war enemy [base number] - show details of the requested war base.") .Alias(new string[] { "-e" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Base", ParameterType.Required) .Do(async(e) => { #region war enemy info bool sucess = false; try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); EnemyBasesView ebv = new EnemyBasesView(); ebv = (from eb in dc.EnemyBasesViews where eb.BASE__.Equals(e.GetArg("Base")) select eb).FirstOrDefault(); if (ebv == null) { await e.Channel.SendMessage("INVALID BASE NUMBER OR NO WAR IN PROGRESS"); } else { await e.Channel.SendMessage("BASE: #" + ebv.BASE__ + ((ebv.CLAIMED_BY == null) ? " | NOT CLAIMED" : " | CLAIMED BY: " + ebv.CLAIMED_BY) + ((ebv.ATTACKS == 0) ? "" : (" | ATTACKS: " + ebv.ATTACKS + " | BEST ATTACK: " + ebv.BEST + " | STARS: " + ebv.STARS + " | DAMAGE: " + ebv.DAMAGE + "%")) + ((ebv.NOTES == null) ? "" : (" | NOTES: " + ebv.NOTES))); } sucess = true; } catch (Exception ex) { sucess = false; throw ex; } if (!sucess) { await e.Channel.SendMessage("THAT COMMAND IS NOT AVAILABLE RIGHT NOW!"); } #endregion }); cgb.CreateCommand("damage") .Description("!war damage - calculate and list available damage from remaining bases.") .Alias(new string[] { "-d", "dmg" }) .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { #region war damage try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> ebv = new List <EnemyBasesView>(); ebv = (from eb in dc.EnemyBasesViews select eb).ToList(); if (ebv != null) { double totaldamage = 0; int warSize = ebv.Count(); string result = "**AVAILABLE DAMAGE**\n"; foreach (EnemyBasesView eb in ebv) { double baseDmg = (100 / warSize) * (eb.DAMAGE ?? 0); totaldamage += baseDmg; if (eb.DAMAGE != 100) { if (eb.BASE__ < 10) { result += "`#" + eb.BASE__ + " "; } else { result += "`#" + eb.BASE__; } result += " | STARS: " + (eb.STARS ?? 0) + " | DAMAGE: " + (eb.DAMAGE ?? 0) + "% | AVAILABLE OVERALL DAMAGE: " + Math.Round(((100.00 / warSize) / 100) * (100.00 - (double)(eb.DAMAGE ?? 0.00)), 2) + "%`\n"; } } await e.Channel.SendMessage(result); } } catch (Exception ex) { throw ex; } #endregion }); cgb.CreateCommand("claim target") .Description("!war claim target [base number] - claim a war base. **note: must have acount linked**") .Alias(new string[] { "-ct", "claim" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("baseNumber", ParameterType.Required) .Do(async(e) => { #region war claim a target try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.DiscordId == e.User.Id.ToString() select u).FirstOrDefault(); if (user != null) { int?returnValue = dc.ClaimBase(user.UserId.ToString(), e.GetArg(0)); switch (returnValue) { case 1: // Claim successful. String msg = "TARGET CLAIMED: #" + e.GetArg(0) + " watch out! " + user.UserName + " is coming for you."; await e.Channel.SendMessage("**CLAIM BASE** ```" + msg + "```"); await LogWarNews(msg, DateTime.UtcNow, user.UserName + " via ClanBot"); break; case 51000: // Both attacks already used. await e.Channel.SendMessage("**CLAIM BASE** ```CLAIM FAILED: sorry " + user.UserName + " you have already used both of your attacks this war.```"); break; case 51001: // Base is already claimed. await e.Channel.SendMessage("**CLAIM BASE** ```CLAIM FAILED: sorry " + user.UserName + " that base is already claimed.```"); break; case 51002: // Cannot hit the same base twice. await e.Channel.SendMessage("**CLAIM BASE** ```CLAIM FAILED: sorry " + user.UserName + " you cannot attack the same base twice.```"); break; case 0: // error claiming await e.Channel.SendMessage("**CLAIM BASE** ```CLAIM FAILED: sorry " + user.UserName + " unable to claim base at the moment... please use the website.```"); break; } } else { await e.Channel.SendMessage("**CLAIM BASE** ```CLAIM FAILED: account is not linked!```"); } } catch (Exception ex) { discord.Log.Error("RegisterDisplayWarInfoCommand", ex.Message); } #endregion }); cgb.CreateCommand("unclaim target") .Description("!war unclaim target [base number] - unclaim a war base. **note: must have acount linked**") .Alias(new string[] { "-ut", "unclaim" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("baseNumber", ParameterType.Required) .Do(async(e) => { #region war unclaim target try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.DiscordId == e.User.Id.ToString() select u).FirstOrDefault(); if (user != null) { CurWarAttack attack = (from a in dc.CurWarAttacks where a.UserID == user.UserId && a.EnemyBase.EnemyBaseNo.ToString() == e.GetArg(0) select a).FirstOrDefault(); if (attack != null) { dc.CurWarAttacks.DeleteOnSubmit(attack); dc.SubmitChanges(); String msg = "TARGET UNCLAIMED: #" + e.GetArg(0) + " you're lucky! " + user.UserName + " has decided not to smash your base."; await e.Channel.SendMessage("**UNCLAIM BASE** ```" + msg + "```"); await LogWarNews(msg, DateTime.UtcNow, user.UserName + " via ClanBot"); } else { await e.Channel.SendMessage("**UNCLAIM BASE** ```UNCLAIM FAILED: sorry " + user.UserName + " you do not seem to have claimed or attacked that base.```"); } } else { await e.Channel.SendMessage("**UNCLAIM BASE** ```UNCLAIM FAILED: account is not linked!```"); } } catch (Exception ex) { discord.Log.Error("RegisterDisplayWarInfoCommand", ex.Message); } #endregion }); cgb.CreateCommand("enter result") .Description("!war enter result [base number] [stars] [attack_type] [damage] - enter attack results. **note: must have acount linked**") .Alias(new string[] { "-er", "result" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("baseNumber", ParameterType.Required) .Parameter("numOfStars", ParameterType.Required) .Parameter("attackType", ParameterType.Required) .Parameter("damagePerc", ParameterType.Required) .Do(async(e) => { #region war enter result try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.DiscordId == e.User.Id.ToString() select u).FirstOrDefault(); // if user is linked if (user != null) { CurWarAttack attack = (from a in dc.CurWarAttacks where a.UserID == user.UserId && a.EnemyBase.EnemyBaseNo.ToString() == e.GetArg(0) select a).FirstOrDefault(); // if claim or attack found for specified base if (attack != null) { // if no resul entered if (attack.Damage == null) { // validate stars attack type and damage AttackValidationResult res = ValidateResults(e.GetArg(1), e.GetArg(2), e.GetArg(3)); if (res.success) { attack.Stars = res.stars; attack.AttackType = res.attackType; attack.Damage = res.damage; dc.SubmitChanges(); String msg = " ATTACK: " + user.UserName + " just smashed #" + e.GetArg(0) + " for " + e.GetArg(1) + " stars and " + e.GetArg(3) + "% damage with " + e.GetArg(2) + "."; await e.Channel.SendMessage("**ENTER RESULT** ```" + msg + "```"); await LogWarNews(msg, DateTime.UtcNow, user.UserName + " via ClanBot"); } else { string failMessage = "invalid results for: "; if (res.stars == null) { failMessage += "stars"; } if (res.attackType == null) { if (res.stars == null) { failMessage += ", "; } failMessage += "attack type"; } if (res.damage == null) { if (res.attackType == null) { failMessage += ", "; } failMessage += "damege"; } await e.Channel.SendMessage("**ENTER RESULT** ```ENTER RESULT FAILED: sorry " + user.UserName + " " + failMessage + ".```"); } } // if result already entered else { // validate stars attack type and damage AttackValidationResult res = ValidateResults(e.GetArg(1), e.GetArg(2), e.GetArg(3)); if (res.success) { attack.Stars = res.stars; attack.AttackType = res.attackType; attack.Damage = res.damage; dc.SubmitChanges(); await e.Channel.SendMessage("**ENTER RESULT** ```RESULT UPDATED: " + user.UserName + " actually hit #" + e.GetArg(0) + " for " + e.GetArg(1) + " stars and " + e.GetArg(3) + "% damage with " + e.GetArg(2) + ".```"); } else { string failMessage = "invalid results for: "; if (res.stars == null) { failMessage += "stars"; } if (res.attackType == null) { if (res.stars == null) { failMessage += ", "; } failMessage += "attack type"; } if (res.damage == null) { if (res.attackType == null || res.stars == null) { failMessage += ", "; } failMessage += "damage"; } await e.Channel.SendMessage("**ENTER RESULT** ```RESULT UPDATED FAILED: sorry " + user.UserName + " " + failMessage + ".```"); } } } // if no claim or attack found for specified base else { await e.Channel.SendMessage("**ENTER RESULT** ```ENTER RESULT FAILED: sorry " + user.UserName + " you do not seem to have claimed or attacked that base.```"); } } // if user is not linked else { await e.Channel.SendMessage("**ENTER RESULT** ```ENTER RESULT FAILED: account is not linked!```"); } } catch (Exception ex) { discord.Log.Error("RegisterDisplayWarInfoCommand", ex.Message); } #endregion }); }); }
public static void RegisterAttendanceCommands(CommandService commands, DiscordClient discord) { commands.CreateGroup("attendance", cgb => { cgb.Category("=== ATTENDANCE COMMANDS ==="); cgb.CreateCommand("overall") .Description("!attendance overall <'name'> - get members overall war attendace.") .Alias(new string[] { "-o" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Member", ParameterType.Optional) .Do(async(e) => { #region attendance overall try { string player = string.Empty; if (e.GetArg("Member") == null || e.GetArg("Member") == "") { player = e.User.Name; } else { player = e.GetArg("Member"); } ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); tvfGetAttendanceResult res = new tvfGetAttendanceResult(); res = (from att in dc.tvfGetAttendance(player) select att).FirstOrDefault(); await e.Channel.SendMessage(player.ToUpper() + "'S WAR ATTENDANCE: " + res.Attendance + "% (" + res.Attended + "/" + res.Totalwars + ")"); } catch (Exception ex) { discord.Log.Error("RegisterGetPlayerAttendanceCommand", ex.Message); } #endregion }); cgb.CreateCommand("season") .Description("!attendance season <'name'> - get members current season war attendace.") .Alias(new string[] { "-s" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Member", ParameterType.Optional) .Do(async(e) => { #region attendance season try { string player = string.Empty; if (e.GetArg("Member") == null || e.GetArg("Member") == "") { player = e.User.Name; } else { player = e.GetArg("Member"); } ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); tvfGetCurSeasonAttendanceResult res = new tvfGetCurSeasonAttendanceResult(); res = (from att in dc.tvfGetCurSeasonAttendance(player) select att).FirstOrDefault(); await e.Channel.SendMessage(player.ToUpper() + "'S SEASON WAR ATTENDANCE: " + res.Attendance + "% (" + res.Attended + "/" + res.Totalwars + ")"); } catch (Exception ex) { discord.Log.Error("RegisterGetPlayerAttendanceCommand", ex.Message); } #endregion }); cgb.CreateCommand("top") .Description("!attendance top <number of bases> - list the top N(default 10) war attenders.") .Alias(new string[] { "-t" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("noOfBases", ParameterType.Optional) .Do(async(e) => { #region attendance top try { int numberOfBases = 10; string test = e.GetArg("noOfBases"); if (e.GetArg("noOfBases").Length >= 1) { int.TryParse(e.GetArg("noOfBases"), out numberOfBases); } ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <ClanBot.tvfMembersAttendanceResult> members = (from att in dc.tvfMembersAttendance() select att).ToList(); members = members.OrderByDescending(m => m.CurrentSeason).ToList(); string message = "**CURRENT SEASON TOP WAR ATTENDERS**\n```"; int count = 0; foreach (tvfMembersAttendanceResult m in members) { if (count >= numberOfBases) { break; } message += "#" + (count + 1) + " - " + m.Username + " - " + m.CurrentSeasonStr + "% \n"; count++; } message += "```"; message += "**LAST SEASON TOP WAR ATTENDERS**\n```"; members = members.OrderByDescending(m => m.LastSeason).ToList(); count = 0; foreach (tvfMembersAttendanceResult m in members) { if (count >= numberOfBases) { break; } message += "#" + (count + 1) + " - " + m.Username + " - " + m.LastSeasonStr + "% \n"; count++; } message += "```"; message += "**OVERALL TOP WAR ATTENDERS**\n```"; members = members.OrderByDescending(m => m.Overall).ToList(); count = 0; foreach (tvfMembersAttendanceResult m in members) { if (count >= numberOfBases) { break; } message += "#" + (count + 1) + " - " + m.Username + " - " + m.OverallStr + "% \n"; count++; } message += "```"; await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterGetPlayerAttendanceCommand", ex.Message); } #endregion }); }); }
public static void RegisterWarningCommands(CommandService commands, DiscordClient discord) { commands.CreateGroup("warning", cgb => { cgb.Category("=== WARNING COMMANDS ==="); cgb.CreateCommand("list") .Description("!warning list - list all member warnings for current season.") .Alias(new string[] { "-l", "" }) .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { #region warning list try { string message = "**MEMBER WARNINGS** \n"; ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <Warning> warnings = new List <Warning>(); warnings = (from w in dc.Warnings select w).ToList(); message += "```"; foreach (Warning w in warnings) { message += "| " + w.WarningName + " = " + w.WarningDescription + " "; } message += "|``` ```"; foreach (Warning w in warnings) { message += "" + w.WarningName + ": "; List <UserWarning> userwarnings = new List <UserWarning>(); userwarnings = (from uw in dc.UserWarnings join u in dc.Users on uw.UserId equals u.UserId join uir in dc.UsersInRoles on u.UserId equals uir.UserId where uw.WarningId == w.WarningId && uir.Role.RoleRank <= 3 select uw).Distinct().ToList(); userwarnings = userwarnings .GroupBy(uw => uw.UserId) .Select(g => g.First()) .ToList(); foreach (UserWarning uw in userwarnings) { User user = (from u in dc.Users where u.UserId == uw.UserId select u).FirstOrDefault(); int count = (from uwCount in dc.UserWarnings where uwCount.UserId == user.UserId && uwCount.WarningId == w.WarningId select uwCount).Count(); message += user.UserName + "(" + count + "), "; } message += "\n"; } message += "```"; await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } #endregion }); cgb.CreateCommand("Add") .Description("!warning add [name] [warning] - add a player warning!") .Alias(new string[] { "-a" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("name", ParameterType.Required) .Parameter("warning", ParameterType.Required) .Do(async(e) => { #region warning add try { if (e.Message.User.Roles.First().Name == "@Co-Leader") { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.UserName.ToLower().Equals(e.GetArg(0).ToLower()) select u).First(); if (user != null) { Warning warning = (from w in dc.Warnings where w.WarningName.ToUpper() == e.GetArg(1).ToUpper() select w).First(); if (warning != null) { UserWarning uw = new UserWarning { UserId = user.UserId, WarningId = warning.WarningId, WarningDateTime = DateTime.UtcNow }; dc.UserWarnings.InsertOnSubmit(uw); dc.SubmitChanges(); await e.Channel.SendMessage(warning.WarningName + " WARNING ADDED TO " + e.GetArg(0).ToUpper()); } else { await e.Channel.SendMessage(e.GetArg(1).ToUpper() + " IS NOT A VALID WARNING CODE!"); } } else { await e.Channel.SendMessage(e.GetArg(0).ToUpper() + " NOT FOUND!"); } } else { await e.Channel.SendMessage("YOU DO NOT HAVE PERMISSION! " + e.Message.User.Roles.First()); } } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex.Message); } #endregion }); cgb.CreateCommand("remove") .Description("!warning remove [name] [warning] - remove a player warning!") .Alias(new string[] { "-r" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("name", ParameterType.Required) .Parameter("warning", ParameterType.Required) .Do(async(e) => { #region warning remove try { if (e.Message.User.Roles.First().Name == "@Co-Leader") { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); Warning warningToRemove = (from wtr in dc.Warnings where wtr.WarningName.ToUpper() == e.GetArg(1).ToUpper() select wtr).First(); User user = (from u in dc.Users where u.UserName.ToLower() == (e.GetArg(0).ToLower()) select u).First(); if (user != null) { UserWarning uw = (from uwarning in dc.UserWarnings where uwarning.UserId == user.UserId && uwarning.WarningId == warningToRemove.WarningId orderby uwarning.WarningDateTime descending select uwarning).FirstOrDefault(); if (uw != null) { dc.UserWarnings.DeleteOnSubmit(uw); dc.SubmitChanges(); string warning = (from w in dc.Warnings where w.WarningId == uw.WarningId select w.WarningName).ToString(); await e.Channel.SendMessage(warningToRemove.WarningName.ToUpper() + " WARNING REMOVED FROM " + e.GetArg(0).ToUpper()); } else { await e.Channel.SendMessage("NO WARNINGS NOT FOUND FOR " + e.GetArg(0).ToUpper() + "!"); } } else { await e.Channel.SendMessage(e.GetArg(0).ToUpper() + " NOT FOUND!"); } } else { await e.Channel.SendMessage("YOU DO NOT HAVE PERMISSION! " + e.Message.User.Roles.First()); } } catch (Exception ex) { discord.Log.Error("RegisterGetClaimedBasesCommand", ex); } #endregion }); }); }
public static async Task StartRegisterNotification(DiscordClient discord, int interval, CommandEventArgs e = null) { try { Channel channel = discord.Servers.FirstOrDefault().FindChannels("leaders_chat", ChannelType.Text, false).FirstOrDefault(); if (registerCheckTask == null) { registerCheckTaskToken = new CancellationTokenSource(); registerCheckTask = Repeat.Interval( TimeSpan.FromSeconds(interval), async () => { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <string> newMembers = (from u in dc.Users from mem in dc.Memberships .Where(me => u.UserId == me.UserId).DefaultIfEmpty() from uir in dc.UsersInRoles .Where(ui => u.UserId == ui.UserId).DefaultIfEmpty() where uir.Role == null select u.UserName).ToList(); if (newMembers.Count > 0) { bool postNotification = false; string msg = "**NEW MEMBER REGISTRATION**\n```"; foreach (string n in newMembers) { bool onCooldown = false; foreach (RegisterNotification rn in registerNotificationsSent) { if (rn.user == n) { if (DateTime.Now > rn.lastNotificationTime.AddMinutes(rn.intervalMin)) { registerNotificationsSent.Remove(rn); break; } else { onCooldown = true; break; } } } if (!onCooldown) { msg += n + " registered and is awaiting approval... \n"; postNotification = true; registerNotificationsSent.Add(new RegisterNotification { user = n, lastNotificationTime = DateTime.Now, intervalMin = 15 }); } } msg += "```"; if (postNotification) { await channel.SendMessage(msg); } } }, registerCheckTaskToken.Token); if (e != null) { await e.Channel.SendMessage("NOTIFICATION FOR REGISTERED MEMBERS IS NOW ON. CHECK INTERVAL SET TO " + interval + " SEC"); } } else { if (e != null) { await e.Channel.SendMessage("NOTIFICATION FOR REGISTERED MEMBERS IS ALREADY ON!"); } } } catch (Exception ex) { discord.Log.Error("Notification.StartRegisterNotification", ex.Message); } }
public static AttackValidationResult ValidateResults(string stars, string attackType, string damage) { AttackValidationResult res = new AttackValidationResult(); // check stars short numOfstars = -1; Int16.TryParse(stars, out numOfstars); if (numOfstars >= 0 && numOfstars <= 3) { res.stars = numOfstars; } else { res.success = false; } // check attack type ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); var attType = (from at in dc.AttackStrats where at.AttackStrat1 == attackType select at).FirstOrDefault(); if (attType != null) { res.attackType = attackType; } else { res.success = false; } // check damage int dmgPerc = -1; Int32.TryParse(damage, out dmgPerc); if (dmgPerc >= 0 && dmgPerc <= 100) { res.damage = dmgPerc; } else { res.success = false; } // additional checks if (res.success) { //check 3 stars are 100% dmg if (res.stars == 3) { if (res.damage != 100) { res.success = false; res.damage = null; } } //check 0 stars are less than 50% dmg if (res.stars == 0) { if (res.damage >= 50) { res.success = false; res.stars = null; res.damage = null; } } } return(res); }
/// <summary> /// Handles the register of all setting commands with the discord server /// </summary> /// <param name="commands">CommandService pointer</param> /// <param name="discord">DiscordClient pointer</param> public static void RegisterWebsiteCommands(CommandService commands, DiscordClient discord) { //create group for settings commands commands.CreateGroup("set", cgb => { cgb.Category("=== SETTING COMMANDS ==="); //create link command to link discord account to website account cgb.CreateCommand("link") .Description("!set link - link your discord to the website, allowing website commands.") .Alias(new string[] { "-l" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("username", ParameterType.Optional) .Parameter("password", ParameterType.Optional) .Do(async(e) => { #region set link List <Message> myMessages = new List <Message>(); Message[] messages = null; //if message came from public channel if (!e.Channel.IsPrivate) { if (currentCommands == null) { currentCommands = new List <ResultObjects.TwoPartCommand>(); } List <ResultObjects.TwoPartCommand> oldCommands = new List <ResultObjects.TwoPartCommand>(); //check is the user has any incomple two part commands foreach (ResultObjects.TwoPartCommand tpc in currentCommands) { if (tpc.user.Id == e.User.Id) { oldCommands.Add(tpc); } } //remove the incomplete commands currentCommands.RemoveAll(item => oldCommands.Contains(item)); //add this new command so we can get the origin message event currentCommands.Add(new ResultObjects.TwoPartCommand() { command = e, channel = e.Channel, user = e.User }); //if someone posts username and password into public channel, delete it ASAP if (e.GetArg(0) != "" || e.GetArg(1) != "") { try { messages = await e.Channel.DownloadMessages(25); messages = messages.OrderByDescending(x => x.Timestamp).ToArray(); //currenly just gets last message.. this needs improving to check for user of last message myMessages.Add(messages[0]); await e.Channel.DeleteMessages(myMessages.ToArray()); myMessages.Clear(); } catch (Exception ex) { Console.WriteLine("ERROR! - " + ex.Message); } await e.Message.Channel.SendMessage("**WARNING** ```DO NOT POST YOU WEBSITE LOGIN IN A PUBLIC CHANNEL. IF THE DETAILS WERE CORRECT, YOU SHOULD CHANGE YOUR PASSWORD ASAP!...```"); } await e.Message.Channel.SendMessage("**WEBSITE LINK STARTED** ```PLEASE COMPLETE VIA PRIVATE MESSAGE...```"); await e.User.PrivateChannel.SendMessage("```WEBSITE LINK WARNING: only ever attempt this via private message. linking from a chat channel will reveal your password! \n" + " To link discord to the website repeat the previous command with the addition of your website username and password. \n" + " e.g !set link <website_username> <website_password>```"); } //if message is private message else { try { bool success = false; //attempt to select user with entered username ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); User user = (from u in dc.Users where u.UserName == e.GetArg(0) select u).FirstOrDefault(); //if user exists if (user != null) { //hash, salt and check passwords is correct if (Encode.EncodePassword(e.GetArg(1), MembershipPasswordFormat.Hashed, user.Membership.PasswordSalt) == user.Membership.Password) { //if user is not linked if (user.DiscordId == null) { //link discord id user.DiscordId = e.User.Id.ToString(); try { dc.SubmitChanges(); success = true; } catch (Exception ex) { discord.Log.Error("Admin.RegisterLinkAccountCommand: error submitting changes.", ex.Message); } if (success) { await e.User.PrivateChannel.SendMessage("```WEBSITE LINK SUCCESSFUL: you can now claim bases on the website and much more...!```"); if (currentCommands.Find(item => e.User.Id == item.user.Id).channel != null) { await currentCommands.Find(item => e.User.Id == item.user.Id).channel.SendMessage("**WEBSITE LINK COMPLETE** ```" + e.User.Name.ToUpper() + " IS POWERED UP AND READY!!```"); } } } //if user is already linked to that account else if (user.DiscordId == e.User.Id.ToString()) { success = true; await e.User.PrivateChannel.SendMessage("```WEBSITE LINK SUCCESSFUL: that account is already linked!```"); if (currentCommands.Find(item => e.User.Id == item.user.Id).channel != null) { await currentCommands.Find(item => e.User.Id == item.user.Id).channel.SendMessage("**WEBSITE LINK COMPLETE** ```" + e.User.Name.ToUpper() + " IS POWERED UP AND READY!!```"); } } //if user is linked but to a differant discord account else { await e.User.PrivateChannel.SendMessage("```WEBSITE LINK FAILED: that account is already linked!```"); } } //if incorrect password else { await e.User.PrivateChannel.SendMessage("```WEBSITE LINK FAILED: please check your username and password are correct!```"); } } //if incorrect username else { await e.User.PrivateChannel.SendMessage("```WEBSITE LINK FAILED: user not found!```"); } //if account link failed for any reason if (!success) { if (currentCommands != null) { if (currentCommands.Find(item => e.User.Id == item.user.Id).channel != null) { await currentCommands.Find(item => e.User.Id == item.user.Id).channel.SendMessage("**WEBSITE LINK CANCELED** ```PLEASE CHECK PRIVATE MESSAGE FOR DETAILS.```"); } } } } catch (Exception ex) { discord.Log.Error("Admin.RegisterLinkAccountCommand", ex.Message); } } #endregion }); }); }
public static void RegisterEnemyNoteCommands(CommandService commands, DiscordClient discord) { commands.CreateGroup("enemy note", cgb => { cgb.Category("=== ENEMY NOTES COMMANDS ==="); cgb.CreateCommand("list") .Description("!enemy note list - list all enemy base notes") .Alias(new string[] { "-l" }) .AddCheck((command, user, channel) => !user.IsBot) .Do(async(e) => { #region enemy note list try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); List <EnemyBasesView> res = new List <EnemyBasesView>(); res = (from ebv in dc.EnemyBasesViews select ebv).ToList(); string message = "ENEMY BASE NOTES: \n"; foreach (EnemyBasesView eb in res) { if (eb.NOTES != null && eb.NOTES != "") { message += "BASE: #" + eb.BASE__ + ((eb.CLAIMED_BY == null) ? " | NOT CLAIMED" : " | CLAIMED BY: " + eb.CLAIMED_BY) + ((eb.ATTACKS == 0) ? "" : (" | ATTACKS: " + eb.ATTACKS + " | BEST ATTACK: " + eb.BEST + " | STARS: " + eb.STARS + " | DAMAGE: " + eb.DAMAGE + "%")) + ((eb.NOTES == null) ? "" : (" | NOTES: " + eb.NOTES)) + "\n"; } } await e.Channel.SendMessage(message); } catch (Exception ex) { discord.Log.Error("RegisterDisplayEnemyBaseNotes", ex.Message); } #endregion }); cgb.CreateCommand("add") .Description("!enemy note add [base number] ['note'] - add a note to the enemy war base.") .Alias(new string[] { "-a" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Base", ParameterType.Required) .Parameter("Note", ParameterType.Required) .Do(async(e) => { #region enemy note add try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); War curWar = new War(); curWar = (from w in dc.Wars orderby w.Date descending select w).Take(1).SingleOrDefault(); EnemyBase eb = new EnemyBase(); eb = (from b in dc.EnemyBases where b.WarID == curWar.WarID && b.EnemyBaseNo.ToString() == e.GetArg("Base") select b).SingleOrDefault(); eb.Notes = e.GetArg("Note"); dc.SubmitChanges(); await e.Channel.SendMessage("NOTE ADDED TO ENEMY BASE #" + e.GetArg("Base")); } catch (Exception ex) { discord.Log.Error("RegisterAddBaseNoteCommand", ex.Message); } #endregion }); cgb.CreateCommand("remove") .Description("!enemy note remove [base number] - remove the note from the enemy war base.") .Alias(new string[] { "-r" }) .AddCheck((command, user, channel) => !user.IsBot) .Parameter("Base", ParameterType.Required) .Do(async(e) => { #region enemy note remove try { ClasherDynastyDataContext dc = new ClasherDynastyDataContext(); War curWar = new War(); curWar = (from w in dc.Wars orderby w.Date descending select w).Take(1).SingleOrDefault(); EnemyBase eb = new EnemyBase(); eb = (from b in dc.EnemyBases where b.WarID == curWar.WarID && b.EnemyBaseNo.ToString() == e.GetArg("Base") select b).SingleOrDefault(); eb.Notes = null; dc.SubmitChanges(); await e.Channel.SendMessage("NOTE REMOVED FROM ENEMY BASE #" + e.GetArg("Base")); } catch (Exception ex) { discord.Log.Error("RegisterRemoveBaseNoteCommand", ex.Message); } #endregion }); }); }