private async Task BankTransferAsync(IUser user = null, float amount = 0) { await Context.Message.DeleteAsync(); BotConfig conf = BotConfig.Load(); var gconf = conf.GetConfig(Context.Guild.Id); if (user == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Incorrect Command Usage", $"Correct Usage: `{gconf.Prefix}bank transfer <@user> <amount>`", false); return; } if (amount <= 0) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", $"The amount must be greater than 0."); return; } LoriUser profile = ProfileDatabase.GetUser(Context.User.Id); if (profile == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", $"We could not find your bank account."); return; } LoriUser profile2 = ProfileDatabase.GetUser(user.Id); if (profile2 == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", $"We could not find {user.Username}'s bank account."); return; } if (profile.GetCurrency() >= amount) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", "You can not afford this transfer."); return; } ProfileDatabase.AddCurrency(Context.User.Id, -amount); ProfileDatabase.AddCurrency(user.Id, amount); float newAmt = profile.GetCurrency(); EmbedBuilder embed = new EmbedBuilder() { Color = Color.DarkPurple, Title = "Transfer successful", Description = $"Successfully transferred ${amount} to {user.Username}.\nNew balance: ${newAmt}" }; await Context.Channel.SendMessageAsync(null, false, embed.Build()); }
private async Task SetMottoAsync([Remainder] string motto = null) { await Context.Message.DeleteAsync(); while (!ProfileDatabase.Ready()) { await Task.Delay(50); } LoriUser profile = ProfileDatabase.GetUser(Context.User.Id); if (profile == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Profile Not Found", $"That users profile could not be found?", false); return; } if (motto == null) { motto = ""; } ProfileDatabase.SetUserMotto(Context.User.Id, motto); await ViewProfileAsync(Context, (Context.User as IUser)); }
public ProfileRenderer(ulong id, LoriUser user) { Id = id; User = user; GetProfileData(); Console.WriteLine(Data.ToString()); }
private async Task DailyAsync() { await Context.Message.DeleteAsync(); LoriUser profile = ProfileDatabase.GetUser(Context.User.Id); if (profile == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", $"We could not find your bank account."); return; } var tgg = LCommandHandler.GetTopGGClient(); bool hasVoted = await tgg.HasVoted(Context.User.Id); if (hasVoted) { // check if already claimed if (ProfileDatabase.HasClaimedDaily(Context.User.Id)) { DateTime claimAt = profile.Claimed.AddHours(12.0); var timeToClaim = claimAt - DateTime.Now; await MessageUtil.SendErrorAsync(Context.Channel as ITextChannel, "Already Claimed", $"You can claim your daily in {timeToClaim.Hours} hours and {timeToClaim.Minutes} minutes.", false); } else { ProfileDatabase.ClaimDaily(Context.User.Id); float newAmt = profile.GetCurrency(); EmbedBuilder embed = new EmbedBuilder() { Color = Color.DarkPurple, Title = "Daily Bonus Claimed", Description = $"New bank balance: ${newAmt}" }; await Context.Channel.SendMessageAsync(null, false, embed.Build()); } } else { EmbedBuilder embed = new EmbedBuilder() { Color = Color.DarkPurple, Author = new EmbedAuthorBuilder() { Name = "Click here to vote!", Url = "https://top.gg/bot/729696788097007717/vote" }, Description = $"Vote on TopGG and then claim your daily!", Footer = new EmbedFooterBuilder() { Text = "If you can't click above, head to this url https://top.gg/bot/729696788097007717/vote" } }; await Context.Channel.SendMessageAsync(null, false, embed.Build()); } }
// Get all users private static async Task <List <LoriUser> > GetAllUsersAsync() { List <LoriUser> users = new List <LoriUser>(); var dbCon = DBConnection.Instance(); dbCon.DatabaseName = LCommandHandler.DATABASE_NAME; if (dbCon.IsConnect()) { var cmd = new MySqlCommand($"SELECT * FROM users", dbCon.Connection); var reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { ulong id = reader.GetUInt64(0); string name = reader.GetString(1); DateTime createdOn = reader.GetDateTime(2); DateTime joinedOn = reader.GetDateTime(3); DateTime lastSeen = reader.GetDateTime(4); string status = reader.GetString(5); string badges = reader.GetString(6); DateTime lastUpdated = reader.GetDateTime(7); string activity = reader.GetString(8); string motto = reader.GetString(9); int currency = reader.GetInt32(10); DateTime claimedAt = reader.GetDateTime(11); if (activity == null) { activity = ""; } if (motto == null) { motto = ""; } if (claimedAt == null) { claimedAt = new DateTime(); } List <int> userBadges = JsonConvert.DeserializeObject <List <int> >(badges); LoriUser newUser = new LoriUser(id, name, createdOn, joinedOn, lastSeen, status, userBadges, lastUpdated, motto, activity, currency, claimedAt); users.Add(newUser); } } reader.Close(); cmd.Dispose(); dbCon.Close(); } return(users); }
// Add user to database private static async Task AddUserToDatabaseAsync(LoriUser user) { var dbCon = DBConnection.Instance(); dbCon.DatabaseName = LCommandHandler.DATABASE_NAME; if (dbCon.IsConnect()) { while (LCommandHandler.Saving) { await Task.Delay(50); } LCommandHandler.Saving = true; string badges = JsonConvert.SerializeObject(user.Badges, Formatting.None); var cmd = new MySqlCommand($"INSERT INTO users (id, name, createdon, joinedon, lastseen, status, badges, lastupdated, motto, activity, currency, claimedat) VALUES (@id, @name, @createdon, @joinedon, @lastseen, @status, @badges, @lastupdated, @motto, @activity, @currency, @claimedat)", dbCon.Connection); cmd.Parameters.Add("@id", MySqlDbType.UInt64).Value = user.Id; cmd.Parameters.Add("@name", MySqlDbType.String).Value = user.Name; cmd.Parameters.Add("@createdon", MySqlDbType.DateTime).Value = user.CreatedOn; cmd.Parameters.Add("@joinedon", MySqlDbType.DateTime).Value = user.JoinedOn; cmd.Parameters.Add("@lastseen", MySqlDbType.DateTime).Value = user.LastSeen; cmd.Parameters.Add("@status", MySqlDbType.String).Value = user.Status; cmd.Parameters.Add("@badges", MySqlDbType.String).Value = badges; cmd.Parameters.Add("@lastupdated", MySqlDbType.DateTime).Value = user.LastUpdated; cmd.Parameters.Add("@activity", MySqlDbType.String).Value = user.Activity; cmd.Parameters.Add("@motto", MySqlDbType.String).Value = user.Motto; cmd.Parameters.Add("@currency", MySqlDbType.Int32).Value = user.Currency; cmd.Parameters.Add("@claimedat", MySqlDbType.DateTime).Value = user.Claimed; try { await cmd.ExecuteNonQueryAsync(); cmd.Dispose(); } catch (Exception e) { await Util.LoggerAsync(new LogMessage(LogSeverity.Error, "Profiles", e.Message, null)); // Lets see what chars are causing the issue... if (e.Message.Contains("Incorrect string value")) { await Util.LoggerAsync(new LogMessage(LogSeverity.Warning, "Profiles", user.Activity, null)); } cmd.Dispose(); } LCommandHandler.Saving = false; dbCon.Close(); } }
// Create a new user and add it to the Users list public static void CreateNewUser(IUser user) { DateTime lastseen = new DateTime(); if (user.Status != UserStatus.Offline && user.Status != UserStatus.Invisible) { lastseen = DateTime.Now; } LoriUser newUser = new LoriUser(user.Id, "", user.CreatedAt.DateTime, DateTime.Now, lastseen, user.Status.ToString(), new List <int>(), DateTime.Now); newUser.SetNew(); Users.Add(newUser); }
private async Task BankAsync() { await Context.Message.DeleteAsync(); LoriUser profile = ProfileDatabase.GetUser(Context.User.Id); if (profile == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Transfer Error", $"We could not find your bank account."); return; } float amount = profile.GetCurrency(); EmbedBuilder embed = new EmbedBuilder() { Color = Color.DarkPurple, Title = "Transfer successful", Description = $"Bank balance: ${amount}" }; await Context.Channel.SendMessageAsync(null, false, embed.Build()); }
// Save all users private static async Task SaveAllUsersAsync(List <LoriUser> users) { var dbCon = DBConnection.Instance(); dbCon.DatabaseName = LCommandHandler.DATABASE_NAME; if (dbCon.IsConnect()) { foreach (LoriUser user in users) { if (!user.Badges.Contains(0)) { user.AddBadge(0); // ADD FOUNDER BADGE } if (user.HasChanged) { while (LCommandHandler.Saving) { await Task.Delay(50); } LCommandHandler.Saving = true; if (user.IsNew) { await AddUserToDatabaseAsync(user); user.HasChanged = false; user.IsNew = false; } else { string badges = JsonConvert.SerializeObject(user.Badges, Formatting.None); var cmd = new MySqlCommand($"UPDATE users SET name = @name, lastseen = @lastseen, status = @status, lastupdated = @lastupdated, motto = @motto, activity = @activity, badges = @badges, currency = @currency, claimedat = @claimedat WHERE id = @id", dbCon.Connection); cmd.Parameters.Add("@id", MySqlDbType.UInt64).Value = user.Id; cmd.Parameters.Add("@name", MySqlDbType.String).Value = user.Name; cmd.Parameters.Add("@lastseen", MySqlDbType.DateTime).Value = user.LastSeen; cmd.Parameters.Add("@status", MySqlDbType.String).Value = user.Status; cmd.Parameters.Add("@lastupdated", MySqlDbType.DateTime).Value = user.LastUpdated; cmd.Parameters.Add("@activity", MySqlDbType.String).Value = user.Activity; cmd.Parameters.Add("@motto", MySqlDbType.String).Value = user.Motto; cmd.Parameters.Add("@badges", MySqlDbType.String).Value = badges; cmd.Parameters.Add("@currency", MySqlDbType.Int32).Value = user.Currency; cmd.Parameters.Add("@claimedat", MySqlDbType.DateTime).Value = user.Claimed; try { await cmd.ExecuteNonQueryAsync(); user.HasChanged = false; user.IsNew = false; cmd.Dispose(); } catch (Exception e) { if (e.Message.StartsWith("Duplicate entry")) { List <LoriUser> usersToRemove; List <LoriUser> usersWithId = new List <LoriUser>(); foreach (LoriUser usr in Users) { if (usr.Id == user.Id) { usersWithId.Add(usr); } } if (usersWithId.Count > 1) { usersToRemove = usersWithId.OrderBy(x => x.JoinedOn).ToList(); usersToRemove.RemoveAt(0); ulong id = user.Id; string name = user.Name; string motto = user.Motto; string status = user.Status; DateTime joinedOn = user.JoinedOn; foreach (LoriUser userToRemove in usersToRemove) { for (int i = 0; i < Users.Count; i++) { LoriUser usr = Users[i]; if (usr.Id == id) { if (usr.Name.Equals(name) && usr.Motto.Equals(motto) && usr.JoinedOn == joinedOn && usr.Status == status) { Users.RemoveAt(i); } } } } await UpdateUserAsync(id); } await Util.LoggerAsync(new LogMessage(LogSeverity.Error, "Profiles", $"Duplicate entry ({user.Id}) - removed duplicate user", null)); } else { await Util.LoggerAsync(new LogMessage(LogSeverity.Error, "Profiles", e.Message, null)); // Lets see what chars are causing the issue... if (e.Message.Contains("Incorrect string value")) { await Util.LoggerAsync(new LogMessage(LogSeverity.Warning, "Profiles", user.Activity, null)); } } cmd.Dispose(); } } LCommandHandler.Saving = false; } } dbCon.Close(); } }
private async Task ViewProfileAsync(ICommandContext Context, IUser User) { if (User.IsBot) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Profile Not Found", $"You can not use this command on bots!", false); return; } while (!ProfileDatabase.Ready()) { await Task.Delay(50); } LoriUser profile = ProfileDatabase.GetUser(User.Id); if (profile == null) { await MessageUtil.SendErrorAsync((Context.Channel as ITextChannel), "Profile Not Found", $"That users profile could not be found?", false); return; } string avatar = User.GetAvatarUrl(size: 2048); string status = "**" + User.Status.ToString() + " for "; Color color; switch (User.Status) { case UserStatus.Offline: color = Color.LightGrey; break; case UserStatus.Online: color = Color.Green; break; case UserStatus.Idle: color = Color.Orange; break; case UserStatus.AFK: color = Color.Orange; break; case UserStatus.DoNotDisturb: color = Color.Red; break; case UserStatus.Invisible: color = Color.LightGrey; break; default: color = Color.LightGrey; break; } DateTime now = DateTime.Now; int seconds = (int)((now - profile.LastSeen).TotalSeconds); int minutes = (int)((now - profile.LastSeen).TotalMinutes); int hours = (int)((now - profile.LastSeen).TotalHours); int days = (int)((now - profile.LastSeen).TotalDays); if (days > 0) { status += $"{days} Days and {hours - (days * 24)} Hours**"; } else if (hours > 0) { status += $"{hours} Hours and {minutes - (hours * 60)} Minutes**"; } else if (minutes > 0) { status += $"{minutes} Minutes and {seconds - (minutes * 60)} Seconds**"; } else { status += $"{seconds} Seconds**"; } if (User.Status == UserStatus.Offline || User.Status == UserStatus.Invisible) { status += $"\n _{profile.Activity}_"; } else { status += $"\n {profile.Activity}"; } if (profile.Motto.Length > 0) { status += $"\n**Motto:** {profile.Motto}"; } EmbedBuilder embed = new EmbedBuilder() { Author = new EmbedAuthorBuilder() { IconUrl = avatar, Name = $"{User.Username}#{User.Discriminator}" }, Description = status, Color = color, Footer = new EmbedFooterBuilder() { Text = $"{EmojiUtil.GetRandomEmoji()} This is a temporary look for profiles..." }, }; embed.AddField(new EmbedFieldBuilder() { Name = "Account Created On: ", Value = profile.CreatedOn.ToShortDateString(), IsInline = true }); embed.AddField(new EmbedFieldBuilder() { Name = "Profile Created On: ", Value = profile.JoinedOn.ToShortDateString(), IsInline = true }); embed.AddField(new EmbedFieldBuilder() { Name = "Last Updated On: ", Value = profile.LastUpdated.ToShortDateString(), IsInline = true }); embed.AddField(new EmbedFieldBuilder() { Name = "Unique Identifier: ", Value = profile.Id, IsInline = true }); embed.AddField(new EmbedFieldBuilder() { Name = "Username: "******"#" + User.Discriminator, IsInline = true }); embed.AddField(new EmbedFieldBuilder() { Name = "Lori's Angel Guilds: ", Value = LCommandHandler.GetUserGuildCount(User.Id), IsInline = true }); ProfileRenderer renderer = new ProfileRenderer(User.Id, profile); renderer.Render(); await Context.Channel.SendFileAsync(renderer.GetPath()); renderer.Dispose(); await Context.Channel.SendMessageAsync(null, false, embed.Build()); }