public override async Task <string> HandleAsync(Message message, TymDbContext db) { var reply = new StringBuilder(); var userId = message.From.Id; var fromUserId = message.ReplyToMessage?.From.Id; if (fromUserId == null) { reply.AppendLine("Reply to a message using /friend command."); } else { var userFriend = await db.UserFriends .Where(f => f.UserId == userId && f.FriendId == fromUserId) .FirstOrDefaultAsync(); if (userFriend == null) { userFriend = new UserFriend() { FriendId = fromUserId.Value, UserId = userId, }; db.UserFriends.Add(userFriend); await db.SaveChangesAsync(); reply.AppendLine($"{message.ReplyToMessage.From.FirstName} can now see your time."); } } return(reply.ToString()); }
public override async Task <string> HandleAsync(Message message, TymDbContext db) { var reply = new StringBuilder(); var userId = message.From.Id; var user = await db.Users .Where(u => u.UserId == userId) .FirstOrDefaultAsync(); if (user == null) { user = new Models.User() { UserId = userId, ChatId = message.Chat.Id, Name = message.From.FirstName, }; db.Users.Add(user); await db.SaveChangesAsync(); reply.AppendLine($"Hi {message.From.FirstName}!"); reply.AppendLine($"Thank you for starting me. You can start by setting your timezone using /timezone command."); } else { user.ChatId = message.Chat.Id; user.Name = message.From.FirstName; await db.SaveChangesAsync(); reply.AppendLine($"Hi {message.From.FirstName}!"); } return(reply.ToString()); }
public override async Task <string> HandleAsync(Message message, TymDbContext db) { var reply = new StringBuilder(); var userId = message.From.Id; var friends = await db.UserFriends .Where(uf => uf.UserId == userId) .ToListAsync(); if (friends.Any()) { var userIds = friends.Select(fr => fr.FriendId); var users = await db.Users .Where(u => userIds.Contains(u.UserId)) .ToDictionaryAsync(u => u.UserId); int count = 1; reply.AppendLine("The following friends can see your current time: \n"); foreach (var uf in friends) { users.TryGetValue(uf.FriendId, out var friend); string name = string.IsNullOrWhiteSpace(friend?.Name) ? $"Friend {count}" : friend.Name; reply.AppendLine($"[{name}](tg://user?id={uf.FriendId})"); count++; } } else { reply.AppendLine("It seems that you have no friends."); reply.AppendLine("To add friends reply /friend to their message, they will then be able to see your current time."); } return(reply.ToString()); }
public override async Task <string> HandleAsync(Message message, TymDbContext db) { var reply = new StringBuilder(); var userId = message.From.Id; var fromUserId = message.ReplyToMessage?.From.Id; if (fromUserId == null) { var user = await db.Users .Where(u => u.UserId == userId) .FirstOrDefaultAsync(); if (user == null) { reply.AppendLine("Please set your timezone using /timezone command"); } else { var zone = DateTimeZoneProviders.Tzdb[user.TimeZone]; var clock = SystemClock.Instance.InZone(zone); var now = clock.GetCurrentZonedDateTime(); var pattern = ZonedDateTimePattern.CreateWithInvariantCulture("dddd MMM dd, yyyy h:mm tt z '('o<g>')'", null); reply.AppendLine("Your current time is: "); reply.Append(pattern.Format(now)); } } else { var userFriend = await db.UserFriends .Include(f => f.User) .Where(f => f.UserId == fromUserId && f.FriendId == userId) .FirstOrDefaultAsync(); if (userFriend == null) { reply.AppendLine($"No time info found for {message.ReplyToMessage.From.Username}."); } else { var zone = DateTimeZoneProviders.Tzdb[userFriend.User.TimeZone]; var clock = SystemClock.Instance.InZone(zone); var now = clock.GetCurrentZonedDateTime(); var pattern = ZonedDateTimePattern.CreateWithInvariantCulture("dddd MMM dd, yyyy h:mm tt z '('o<g>')'", null); reply.AppendLine($"{message.ReplyToMessage.From.Username} current time is: "); reply.Append(pattern.Format(now)); } } return(reply.ToString()); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(BotService botService, TymDbContext db, ILogger <Startup> logger) { while (true) { try { db.Database.Migrate(); logger.LogInformation("Database migration successful."); break; } catch (Exception ex) { logger.LogError($"Database not ready: {ex.Message}"); Task.Delay(1000).Wait(); } } botService.Initialize(); }
public abstract Task <string> HandleAsync(Message message, TymDbContext db);
public override async Task <string> HandleAsync(Message message, TymDbContext db) { var textMessage = message.Text.Trim(); var reply = new StringBuilder(); var userId = message.From.Id; var fromUserId = message.ReplyToMessage?.From.Id; var inputZone = textMessage .Replace($"/{BotCommands.Timezone}@{BotService.Bot.Username}", "") .Replace($"/{BotCommands.Timezone}", "") .Trim() .ToLower(); var timezone = DateTimeZoneProviders.Tzdb.Ids.SingleOrDefault(id => id.ToLower() == inputZone); if (timezone == null) { var timezones = DateTimeZoneProviders.Tzdb.Ids .Where(id => id.ToLower().Contains(inputZone)) .Take(10); if (timezones.Count() == 0) { timezones = DateTimeZoneProviders.Tzdb.Ids.Take(10); } reply.AppendLine("Sample usage: /timezone Asia/Tokyo"); reply.AppendLine("\nAre you looking for these timezones?\n"); foreach (var z in timezones) { reply.AppendLine(z); } } else { var user = await db.Users .Where(f => f.UserId == userId) .FirstOrDefaultAsync(); if (user == null) { user = new Models.User() { UserId = userId, TimeZone = timezone, Name = message.From.FirstName, }; db.Users.Add(user); await db.SaveChangesAsync(); } else { user.TimeZone = timezone; user.Name = message.From.FirstName; await db.SaveChangesAsync(); } var zone = DateTimeZoneProviders.Tzdb[timezone]; var clock = SystemClock.Instance.InZone(zone); var now = clock.GetCurrentZonedDateTime(); var pattern = ZonedDateTimePattern.CreateWithInvariantCulture("dddd MMM dd, yyyy h:mm tt z '('o<g>')'", null); reply.AppendLine("Your current time is: "); reply.Append(pattern.Format(now)); } return(reply.ToString()); }