示例#1
0
        public async Task <IEnumerable <PlanetMessage> > GetLastMessages(ulong channel_id, int count = 10)
        {
            // Prevent requesting a ridiculous amount of messages
            if (count > 64)
            {
                count = 64;
            }

            List <PlanetMessage> staged   = PlanetMessageWorker.GetStagedMessages(channel_id, count);
            List <PlanetMessage> messages = null;

            count = count - staged.Count;

            if (count > 0)
            {
                await Task.Run(() =>
                {
                    messages =
                        Context.PlanetMessages.Where(x => x.Channel_Id == channel_id)
                        .OrderByDescending(x => x.Message_Index)
                        .Take(count)
                        .Reverse()
                        .ToList();
                });

                messages.AddRange(staged);
            }

            return(messages);
        }
示例#2
0
        private static async Task GetMessages(HttpContext ctx, ValourDB db, ulong channel_id,
                                              [FromHeader] string authorization,
                                              ulong index = ulong.MaxValue, int count = 10)
        {
            // Request parameter validation //
            if (count > 64)
            {
                ctx.Response.StatusCode = 400;
                await ctx.Response.WriteAsync("Max count is 64");

                return;
            }


            // Request authorization //

            AuthToken auth = await ServerAuthToken.TryAuthorize(authorization, db);

            if (auth == null)
            {
                ctx.Response.StatusCode = 401;
                await ctx.Response.WriteAsync($"Token is invalid [token: {authorization}]");

                return;
            }

            ServerPlanetChatChannel channel = await db.PlanetChatChannels.Include(x => x.Planet)
                                              .ThenInclude(x => x.Members.Where(x => x.User_Id == auth.User_Id))
                                              .FirstOrDefaultAsync(x => x.Id == channel_id);

            var member = channel.Planet.Members.FirstOrDefault();

            if (member == null || !await channel.HasPermission(member, ChatChannelPermissions.ViewMessages, db))
            {
                ctx.Response.StatusCode = 401;
                await ctx.Response.WriteAsync("Member lacks ChatChannelPermissions.ViewMessages node");

                return;
            }

            List <PlanetMessage> staged   = PlanetMessageWorker.GetStagedMessages(channel_id, count);
            List <PlanetMessage> messages = null;

            count = count - staged.Count;

            if (count > 0)
            {
                await Task.Run(() =>
                {
                    messages =
                        db.PlanetMessages.Where(x => x.Channel_Id == channel_id && x.Message_Index < index)
                        .OrderByDescending(x => x.Message_Index)
                        .Take(count)
                        .Reverse()
                        .ToList();
                });

                messages.AddRange(staged.Where(x => x.Message_Index < index));
            }

            ctx.Response.StatusCode = 200;
            await ctx.Response.WriteAsJsonAsync(messages);
        }