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());
        }
Exemple #2
0
        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());
        }
Exemple #4
0
        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());
        }
Exemple #5
0
        // 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);
Exemple #7
0
        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());
        }