public async Task Create(CommandContext ctx)
        {
            var message = new Entities.ClientMessage
            {
                ChannelId = ctx.Channel.Id.ToString(),
                ServerId  = ctx.Guild.Id.ToString()
            };

            var teamoEntry = new Entities.TeamoEntry
            {
                EndDate    = DateTime.Now + new TimeSpan(0, 0, 20),
                Game       = "League of LoL",
                MaxPlayers = 5,
                Message    = message
            };

            try
            {
                await _playService.CreateAsync(teamoEntry);
            }
            catch (Exception e)
            {
                await PostExceptionMessageAsync(ctx.Channel, _logger, e, "Could not create a new teamo :(");

                return;
            }
        }
Exemple #2
0
        public static Models.Post AsModelType(this Entities.TeamoEntry entityEntry)
        {
            var members = entityEntry.Members.ConvertAll((entityMember) => entityMember.AsModelType());

            return(new Models.Post
            {
                PostId = entityEntry.Id.GetValueOrDefault(0),
                Message = entityEntry.Message.AsModelType(),
                Game = entityEntry.Game,
                Members = members,
                EndDate = entityEntry.EndDate,
                MaxPlayers = entityEntry.MaxPlayers
            });
        }
Exemple #3
0
        public async Task <Entities.ClientMessage> CreateMessageAsync(Entities.TeamoEntry entry)
        {
            _logger.LogInformation("Creating new Discord message");
            var embed = await CreateEmbedAsync(entry);

            var channel = await _client.GetChannelAsync(ulong.Parse(entry.Message.ChannelId));

            var dMessage = await channel.SendMessageAsync(embed : embed);

            //var numReactions = numPlayers < 11 ? numPlayers : 10;
            //for (int i = 1; i < numReactions; i++)
            //{
            //    await message.CreateReactionAsync(CreateEmojiFromNumber(i));
            //}
            //await message.CreateReactionAsync(GetCancelEmoji());

            return(dMessage.AsEntityType());
        }
 public async Task <Entities.TeamoEntry> CreateAsync(Entities.TeamoEntry entry)
 {
     return(await ExclusiveAsync(async() =>
     {
         if (entry.Id != null)
         {
             // TODO: Better exception
             throw new Exception("Cannot create a new database post with non-zero ID");
         }
         var post = await Posts.AddAsync(entry.AsModelType());
         await SaveChangesAsync();
         _logger.LogDebug($"Database entry " +
                          $"{entry.Message.ChannelId} : " +
                          $"{entry.Message.MessageId} : " +
                          $"{entry.Message.ServerId} created. " +
                          $"Post id: {post.Entity.PostId}");
         return post.Entity.AsEntityType();
     }));
 }
Exemple #5
0
        public async Task <Entities.TeamoEntry> CreateAsync(Entities.TeamoEntry entry)
        {
            // Create Discord message
            var message = await _clientService.CreateMessageAsync(entry);

            entry.Message = message;

            // Create database entry
            try
            {
                entry = await _dbContext.CreateAsync(entry);

                await _clientService.UpdateMessageAsync(entry);
            }
            catch
            {
                await _clientService.DeleteMessageAsync(message);

                throw;
            }

            if (entry.Id == null)
            {
                // TODO: Error handling
                throw new Exception("Newly created Discord message got a null Id!");
            }


            // Create timers
            double updateInterval = 5000.0;
            var    timers         = new Timers(updateInterval, entry, _dbContext, _clientService, _logger);

            timers.TimerFinished += (sender, e) => _timers.Remove(entry.Id.Value);
            timers.Start();
            _timers.Add(entry.Id.Value, timers);

            return(entry);
        }
Exemple #6
0
        // ------------ Internal utility methods ------------
        private async Task <DiscordEmbed> CreateEmbedAsync(Entities.TeamoEntry entry)
        {
            var game       = entry.Game;
            var date       = entry.EndDate;
            var maxPlayers = entry.MaxPlayers;
            var members    = entry.Members;
            var id         = entry.Id;

            var builder = new DiscordEmbedBuilder
            {
                Title       = $"Dags för **{game}**!!",
                Description = $"**Start: {date}** - För anmälan, tryck emotes nedan med antal som vill spela."
            };

            builder.Color = DiscordColor.Purple;
            builder.AddField("Tid kvar", $"{date - DateTime.Now}");
            builder.AddField("Spelare per lag", $"{maxPlayers}");
            builder.AddField("Anmälda", $"Inga anmälda än");

            if (members != null)
            {
                foreach (var member in members)
                {
                    var discordUser = await _client.GetUserAsync(ulong.Parse(member.ClientUserId));

                    builder.AddField($"Member: {discordUser.Username}", $"{member.NumPlayers}");
                }
            }
            if (!(id is null))
            {
                builder.AddField("Id", $"{id}");
            }
            builder.Footer = new DiscordEmbedBuilder.EmbedFooter
            {
                Text = $"Uppdateras var 15:e sekund. Senast uppdaterad {DateTime.Now}"
            };
            return(builder.Build());
        }
Exemple #7
0
        public async Task UpdateMessageAsync(Entities.TeamoEntry entry)
        {
            ulong messageId = ulong.Parse(entry.Message.MessageId);
            ulong channelId = ulong.Parse(entry.Message.ChannelId);
            var   channel   = await _client.GetChannelAsync(channelId);

            var message = await channel.GetMessageAsync(messageId);

            var embed = await CreateEmbedAsync(entry);

            await message.ModifyAsync(embed : embed);

            var maxPlayers = entry.MaxPlayers;

            //_logger.LogInformation($"Number of reactions: {message.Reactions.Count}");
            //var reactions = message.Reactions;
            //var reaction = reactions.First();

            for (int i = 0; i < NumberEmojiNames.Length; i++)
            {
                var emoji      = CreateEmojiFromNumber(i + 1);
                var emojiUsers = await message.GetReactionsAsync(CreateEmojiFromNumber(i + 1));

                var emojiNumber = emoji.GetAsNumber();
                if (i < maxPlayers)
                {
                    if (emojiUsers.Count == 0)
                    {
                        await message.CreateReactionAsync(emoji);
                    }
                    else if (!emojiUsers.Contains(_client.CurrentUser))
                    {
                        _logger.LogWarning($"Number emoji {emoji} exists without bot reaction. Removing and readding emoji.");
                        await message.DeleteReactionsEmojiAsync(emoji);

                        await message.CreateReactionAsync(emoji);
                    }
                }

                if (i > maxPlayers - 1 && emojiUsers.Count > 0)
                {
                    await message.DeleteReactionsEmojiAsync(emoji);
                }

                foreach (var member in entry.Members)
                {
                    ulong memberId = ulong.Parse(member.ClientUserId);
                    if (emojiUsers.Any((u) => u.Id == memberId))
                    {
                        if (emojiNumber != member.NumPlayers)
                        {
                            await message.DeleteReactionAsync(emoji, emojiUsers.Single((u) => u.Id == memberId));
                        }
                    }
                    else if (emojiNumber == member.NumPlayers)
                    {
                        _logger.LogWarning($"Mismatch between number of players in database and discord reactions for member {memberId}." +
                                           $"Number of players according to database: {member.NumPlayers}");
                    }
                }
            }

            // TODO: Update number of emojis
        }
Exemple #8
0
 public Task CreateStartMessageAsync(Entities.TeamoEntry entry)
 {
     _logger.LogError("Method to create start message not implemented!");
     return(Task.CompletedTask);
 }
        public async void TestEverything()
        {
            //var connection = new SqliteConnection("DataSource=:memory:");
            var connection = new SqliteConnection("DataSource=myshareddb;mode=memory;cache=shared");

            connection.Open();

            try
            {
                var deps = new ServiceCollection()
                           .AddLogging((logging) =>
                {
                    logging.AddProvider(new XUnitLoggerProvider(_testOutputHelper));
                })
                           .AddDbContext <TeamoContext>((options) =>
                {
                    _testOutputHelper.WriteLine("Configuring options from test");
                    options.UseSqlite(connection);
                })
                           .AddSingleton <IClientService, TestClientService>()
                           .AddSingleton <IMainService, MainService>();

                var serviceProvider = deps.BuildServiceProvider();

                var context = serviceProvider.GetService <TeamoContext>();
                context.Database.EnsureCreated();

                var mainService = serviceProvider.GetService <IMainService>();

                var entry1 = new Entities.TeamoEntry
                {
                    EndDate    = DateTime.Now + TimeSpan.FromSeconds(20),
                    Game       = "Test Game 1",
                    MaxPlayers = 7,
                    Message    = new Entities.ClientMessage
                    {
                        ServerId  = "1",
                        ChannelId = "1"
                    }
                };

                var entry2 = new Entities.TeamoEntry
                {
                    EndDate    = DateTime.Now + TimeSpan.FromSeconds(20),
                    Game       = "Test Game 2",
                    MaxPlayers = 3,
                    Message    = new Entities.ClientMessage
                    {
                        ServerId  = "1",
                        ChannelId = "1"
                    }
                };

                var entry1WithId = await mainService.CreateAsync(entry1);

                var entry2WithId = await mainService.CreateAsync(entry2);

                Assert.NotEqual(entry1WithId.Id, entry2WithId.Id);
                Assert.NotEqual(entry1WithId.Message.MessageId, entry2WithId.Message.MessageId);
            }
            finally
            {
                connection.Close();
            }
        }