/// <summary> /// Gets a user setting from the database /// </summary> /// <typeparam name="T">The type the setting should be (bool, int, string)</typeparam> /// <param name="user">What user the setting comes from</param> /// <param name="field">The name of the setting</param> /// <param name="db">The database TelegramBotDbContext</param> /// <param name="def">The default value for the field</param> /// <returns></returns> public static T GetSetting <T>(this TelegramBotUser user, string field, TelegramBotDbContext db, object def) { //if (db.Connection.State != ConnectionState.Open) // db.Connection.Open(); ////verify settings exist //var columns = new SQLiteCommand("PRAGMA table_info(users)", db.Connection).ExecuteReader(); //var t = default(T); //while (columns.Read()) //{ // if (String.Equals(columns[1].ToString(), field)) // { // var result = new SqliteCommand($"select {field} from users where ID = {user.ID}", db.Connection).ExecuteScalar(); // if (t != null && t.GetType() == typeof(bool)) // { // result = (result.ToString() == "1"); //make it a boolean value // } // return (T)result; // } //} //var type = "BLOB"; //if (t == null) // type = "TEXT"; //else if (t.GetType() == typeof(int)) // type = "INTEGER"; //else if (t.GetType() == typeof(bool)) // type = "INTEGER"; //new SqliteCommand($"ALTER TABLE users ADD COLUMN {field} {type} DEFAULT {(type == "INTEGER" ? def : $"'{def}'")};", db.Connection) // .ExecuteNonQuery(); //return (T)def; throw new NotImplementedException(); }
public static TelegramBotUser GetTelegramUser(TelegramBotDbContext db, int adminId, Update update = null, InlineQuery query = null, CallbackQuery cbQuery = null, bool logPoint = true) { var users = db.Users.AsNoTracking().ToList(); var from = update?.Message.From ?? query?.From ?? cbQuery?.From; if (from == null) { return(null); } var u = db.Users.AsNoTracking().FirstOrDefault(x => x.UserId == from.Id) ?? new TelegramBotUser { FirstSeen = DateTime.Now, Points = 0, Debt = 0, IsBotAdmin = false, //Program.LoadedSetting.TelegramDefaultAdminUserId == from.Id, UserId = from.Id }; u.UserName = from.Username; if (query?.Location != null) { u.Location = $"{query.Location.Latitude},{query.Location.Longitude}"; } u.Name = (from.FirstName + " " + from.LastName).Trim(); if (logPoint) { var where = update != null ? update.Message.Chat.Title ?? "Private" : "Using inline query"; u.LastHeard = DateTime.Now; u.LastState = "talking in " + where; u.Points += update?.Message.Text.Length ?? 0 * 10; } u.Save(db); return(u); }
public static void SetString(this TelegramBotSetting set, TelegramBotDbContext db, string field, string value) { throw new NotImplementedException(); //new SQLiteCommand($"Update settings set {field} = '{value}' WHERE Alias = '{set.Alias}'", db.Connection) // .ExecuteNonQuery(); }
public static void Save(this TelegramBotGroup u, TelegramBotDbContext db) { if (u.ID == null || !ExistsInDb(u, db)) { //need to insert //db.ExecuteNonQuery( // "insert into chatgroup (GroupId, Name, UserName, MemberCount) VALUES (@GroupId, @Name, @UserName, @MemberCount)", // u); //u.ID = // db.Connection.Query<int>( // $"SELECT ID FROM chatgroup WHERE GroupId = @GroupId", u) // .First(); db.Groups.Add(u); db.SaveChanges(); u.ID = db.Groups.FirstOrDefault(c => c.GroupId == u.GroupId).ID; } else { db.Groups.Update(u); db.SaveChanges(); //db.ExecuteNonQuery( // "UPDATE chatgroup SET GroupId = @GroupId, Name = @Name, UserName = @UserName, MemberCount = @MemberCount WHERE ID = @ID", // u); } }
public static string ExecuteQuery(this TelegramBotDbContext db, string commandText, object param = null) { // Ensure we have a connection //if (db.Connection == null) //{ // throw new NullReferenceException( // "Please provide a connection"); //} //// Ensure that the connection state is Open //if (db.Connection.State != ConnectionState.Open) //{ // db.Connection.Open(); //} //var reader = db.Connection.ExecuteReader(commandText, param); //var response = ""; //for (int i = 0; i < reader.FieldCount; i++) //{ // response += $"{reader.GetName(i)} - "; //} //response += "\n"; //while (reader.Read()) //{ // for (int i = 0; i < reader.FieldCount; i++) // { // response += $"{reader[i]} - "; // } // response += "\n"; //} //// Use Dapper to execute the given query //return response; throw new NotImplementedException(); }
public virtual void SeedDb(TelegramBotDbContext db, params int[] admins) { if (!db.Users.AsNoTracking().ToList().Any(c => c.UserId == LoadedSetting.TelegramDefaultAdminUserId)) { using (var tx = db.Database.BeginTransaction()) { try { foreach (var u in admins) { db.Users.Add(new TelegramBotUser() { IsBotAdmin = true, UserId = u, FirstSeen = DateTime.UtcNow }); } db.Users.Add(new TelegramBotUser() { IsBotAdmin = true, UserId = LoadedSetting.TelegramDefaultAdminUserId, FirstSeen = DateTime.UtcNow }); db.SaveChanges(); tx.Commit(); } catch (Exception ex) { Log.Write($"Saving admin error: {ex}", LogLevel.Error, null, "error.log"); } } } }
/// <summary> /// Returns the requested field from settings. /// </summary> /// <param name="set"></param> /// <param name="db"></param> /// <param name="field"></param> /// <returns></returns> public static string GetString(this TelegramBotSetting set, TelegramBotDbContext db, string field) { throw new NotImplementedException(); //return // db.Connection.Query<string>($"select {field} from settings where Alias = '{set.Alias}'") // .FirstOrDefault(); }
/// <summary> /// Constructor. You may inject IServiceProvider to freely use you registered services in your modules /// </summary> /// <param name="key"></param> /// <param name="adminId"></param> /// <param name="serviceProvider"></param> /// <param name="alias"></param> public TelegramBotWrapper(string key, int adminId, IServiceProvider serviceProvider = null, string alias = "TelegramBotFramework", bool needNewUserApproove = false, string paymentToken = null, string dir = "", string webHookUrl = null, bool shouldUseInMemoryDb = false) { if (!String.IsNullOrEmpty(webHookUrl)) { _webHookUrl = webHookUrl; } if (!String.IsNullOrEmpty(dir)) { RootDirectory = dir; } UserMustBeApprooved = needNewUserApproove; _paymentToken = paymentToken; ServiceProvider = serviceProvider; if (!Directory.Exists(Path.Combine(RootDirectory))) { Directory.CreateDirectory(Path.Combine(RootDirectory)); } Log = new TelegramBotLogger(Path.Combine(RootDirectory, "Logs-" + alias)); var setting = new TelegramBotSetting() { Alias = alias, TelegramDefaultAdminUserId = adminId, TelegramBotAPIKey = key }; LoadedSetting = setting; try { Db = shouldUseInMemoryDb ? new TelegramBotDbContext() : new TelegramBotDbContext(Path.Combine(RootDirectory, alias)); Db.Database.EnsureCreated(); SeedDb(Db); } catch (Exception ex) { Log.WriteLine($"Db creating data error: {ex.ToString()}", LogLevel.Error, null, "error.log"); } Console.OutputEncoding = Encoding.UTF8; Messenger.MessageSent += MessengerOnMessageSent; AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException; // var telegramBotModuleDir = Path.Combine(RootDirectory, "AddonModules-" + alias); //WatchForNewModules(telegramBotModuleDir); }
public static TelegramBotGroup GetGroup(TelegramBotDbContext db, Update update = null) { var from = update?.Message?.Chat; if (from == null) { return(null); } var u = db.Groups.FirstOrDefault(c => c.ID == from.Id) ?? new TelegramBotGroup { GroupId = from.Id }; u.Name = from.Title; u.UserName = from.Username; u.Save(db); return(u); }
public static int ExecuteNonQuery(this TelegramBotDbContext db, string commandText, object param = null) { // Ensure we have a connection //if (db.Connection == null) //{ // throw new NullReferenceException( // "Please provide a connection"); //} //// Ensure that the connection state is Open //if (db.Connection.State != ConnectionState.Open) //{ // db.Connection.Open(); //} //// Use Dapper to execute the given query //return db.Connection.Execute(commandText, param); throw new NotImplementedException(); }
public static void Save(this TelegramBotUser u, TelegramBotDbContext db) { if (u.ID == null || !ExistsInDb(u, db)) { using (var tx = db.Database.BeginTransaction()) { try { db.Users.Add(u); db.SaveChanges(); u.ID = db.Users.FirstOrDefault(c => c.UserId == u.UserId).ID; } catch { } } //db.Database.ExecuteSqlCommand( // "insert into users (Name, UserId, UserName, FirstSeen, LastHeard, Points, Location, Debt, LastState, Greeting, Grounded, GroundedBy, IsBotAdmin, LinkingKey, Description) VALUES (@Name, @UserId, @UserName, @FirstSeen, @LastHeard, @Points, @Location, @Debt, @LastState, @Greeting, @Grounded, @GroundedBy, @IsBotAdmin, @LinkingKey, @Description)", // u); //u.ID = // db.Database.Query<int>( // $"SELECT ID FROM Users WHERE UserId = @UserId", u) // .First(); } else { //using(var tx = db.Database.BeginTransaction()) //{ // try // { // db.Users.Update(u); // db.SaveChanges(); // tx.Commit(); // } // catch { } //} //db.ExecuteNonQuery( // "UPDATE users SET Name = @Name, UserId = @UserId, UserName = @UserName, FirstSeen = @FirstSeen, LastHeard = @LastHeard, Points = @Points, Location = @Location, Debt = @Debt, LastState = @LastState, Greeting = @Greeting, Grounded = @Grounded, GroundedBy = @GroundedBy, IsBotAdmin = @IsBotAdmin, LinkingKey = @LinkingKey, Description = @Description WHERE ID = @ID", // u); } }
/// <summary> /// Gets a group setting from the database /// </summary> /// <typeparam name="T">The type the setting should be (bool, int, string)</typeparam> /// <param name="group">What group the setting comes from</param> /// <param name="field">The name of the setting</param> /// <param name="db">The database TelegramBotDbContext</param> /// <param name="def">The default value for the field</param> /// <returns></returns> public static bool SetSetting <T>(this TelegramBotGroup group, string field, TelegramBotDbContext db, object def, object value) { //try //{ // if (db.Connection.State != ConnectionState.Open) // db.Connection.Open(); // //verify settings exist // var columns = new SQLiteCommand("PRAGMA table_info(chatgroup)", db.Connection).ExecuteReader(); // var t = default(T); // var type = "BLOB"; // if (t == null) // type = "TEXT"; // else if (t.GetType() == typeof(int)) // type = "INTEGER"; // else if (t.GetType() == typeof(bool)) // type = "INTEGER"; // bool settingExists = false; // while (columns.Read()) // { // if (String.Equals(columns[1].ToString(), field)) // { // settingExists = true; // } // } // if (!settingExists) // { // new SQLiteCommand($"ALTER TABLE chatgroup ADD COLUMN {field} {type} DEFAULT {(type == "INTEGER" ? def : $"'{def}'")};", db.Connection) // .ExecuteNonQuery(); // } // new SQLiteCommand($"UPDATE chatgroup set {field} = {(type == "INTEGER" ? (t != null && t.GetType() == typeof(bool)) ? (bool)value ? "1" : "0" : value : $"'{value}'")} where ID = {group.ID}", db.Connection).ExecuteNonQuery(); // return true; //} //catch //{ // return false; //} throw new NotImplementedException(); }
public static void Save(this TelegramBotSetting set, TelegramBotDbContext db) { if (set.ID == null || !ExistsInDb(set, db)) { //need to insert //db.ExecuteNonQuery( // "insert into settings (Alias, TelegramBotAPIKey, TelegramDefaultAdminUserId) VALUES (@Alias, @TelegramBotAPIKey, @TelegramDefaultAdminUserId)", // set); //set.ID = db.Connection.Query<int>("SELECT ID FROM Settings WHERE Alias = @Alias", set).First(); db.Settings.Add(set); db.SaveChanges(); set.ID = db.Settings.FirstOrDefault(c => c.Alias == set.Alias).ID; } else { //db.ExecuteNonQuery( // "UPDATE settings SET Alias = @Alias, TelegramBotAPIKey = @TelegramBotAPIKey, TelegramDefaultAdminUserId = @TelegramDefaultAdminUserId WHERE ID = @ID", // set); db.Settings.Update(set); db.SaveChanges(); } }
/// <summary> /// Adds a field to the settings table, if needed /// </summary> /// <param name="set">the current settings loaded</param> /// <param name="db">TelegramBotDbContext of the database</param> /// <param name="field">Name of the field you need</param> /// <returns>Whether or not the field was missing / was added</returns> public static bool AddField(this TelegramBotSetting set, TelegramBotDbContext db, string field) { //if (db.Connection.State != ConnectionState.Open) // db.Connection.Open(); ////verify settings exist //var columns = new SQLiteCommand("PRAGMA table_info(settings)", db.Connection).ExecuteReader(); //var settingExists = false; //while (columns.Read()) //{ // if (String.Equals(columns[1].ToString(), field)) // settingExists = true; //} //if (!settingExists) //{ // new SQLiteCommand($"ALTER TABLE settings ADD COLUMN {field} TEXT DEFAULT '';", db.Connection) // .ExecuteNonQuery(); // return true; //} //return false; throw new NotImplementedException(); }
public static bool ExistsInDb(this TelegramBotUser user, TelegramBotDbContext db) { return(db.Users.AsNoTracking().Any(i => i.ID == user.ID)); }
public static TelegramBotUser GetTarget(this Message message, string args, TelegramBotUser sourceUser, TelegramBotDbContext db) { if (message == null) { return(sourceUser); } if (message?.ReplyToMessage != null) { var m = message.ReplyToMessage; var userid = m.ForwardFrom?.Id ?? m.From.Id; return(db.Users.AsNoTracking().FirstOrDefault(x => x.UserId == userid) ?? sourceUser); } if (String.IsNullOrWhiteSpace(args)) { return(sourceUser); } //check for a user mention var mention = message?.Entities.FirstOrDefault(x => x.Type == MessageEntityType.Mention); var textmention = message?.Entities.FirstOrDefault(x => x.Type == MessageEntityType.TextMention); var id = 0; var username = ""; if (mention != null) { username = message.Text.Substring(mention.Offset + 1, mention.Length - 1); } else if (textmention != null) { id = textmention.User.Id; } TelegramBotUser result = null; if (!String.IsNullOrEmpty(username)) { result = db.Users.AsNoTracking().FirstOrDefault( x => x.UserName.ToUpper() == username.ToUpper()); } else if (id != 0) { result = db.Users.AsNoTracking().FirstOrDefault(x => x.UserId == id); } else { result = db.Users.AsNoTracking().ToList().FirstOrDefault( x => String.Equals(x.UserId.ToString(), args, StringComparison.InvariantCultureIgnoreCase) || String.Equals(x.UserName, args.Replace("@", ""), StringComparison.InvariantCultureIgnoreCase)); } return(result ?? sourceUser); }
public static bool ExistsInDb(this TelegramBotGroup group, TelegramBotDbContext db) { return(db.Groups.Any(c => c.ID == group.ID)); }
public static void RemoveFromDb(this TelegramBotGroup group, TelegramBotDbContext db) { db.Groups.Remove(group); db.SaveChanges(); }
public static void RemoveFromDb(this TelegramBotUser user, TelegramBotDbContext db) { db.Users.Remove(user); db.SaveChanges(); }
public static bool ExistsInDb(this TelegramBotSetting set, TelegramBotDbContext db) { return(db.Settings.Any(c => c.ID == set.ID)); }
public static void RemoveFromDb(this TelegramBotSetting set, TelegramBotDbContext db) { db.Settings.Remove(set); db.SaveChanges(); }