示例#1
0
        private async Task <Mastodon.Status> _translateStatus(CollectionTools.EntityCollectionItem item)
        {
            var isCreate   = item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Create");
            var isAnnounce = item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Announce");

            if (!isCreate && !isAnnounce)
            {
                return(await _translateNote(item.Entity, null));
            }

            var inner = await _translateNote(await _entityStore.GetEntity(item.Entity.Data["object"].First().Id, true), (isCreate && item.CollectionItemId >= 0)?item.CollectionItemId.ToString() : null);

            if (inner == null)
            {
                return(null);
            }

            if (isCreate)
            {
                return(inner);
            }

            return(new Mastodon.Status
            {
                id = item.CollectionItemId.ToString(),
                uri = inner.uri,
                url = inner.url,
                account = await _processAccount(await _entityStore.GetEntity(item.Entity.Data["actor"].First().Id, true)),
                in_reply_to_id = inner.in_reply_to_id,
                in_reply_to_account_id = inner.in_reply_to_account_id,
                reblog = inner,
                content = inner.content,
                created_at = DateTime.Parse((string)item.Entity.Data["published"].FirstOrDefault()?.Primitive ?? DateTime.Now.ToString()),
                emojis = inner.emojis,
                reblogs_count = inner.reblogs_count,
                favourites_count = inner.favourites_count,
                reblogged = inner.reblogged,
                favourited = inner.favourited,
                muted = inner.muted,
                sensitive = inner.sensitive,
                spoiler_text = inner.spoiler_text,
                visibility = inner.visibility,
                media_attachments = inner.media_attachments,
                mentions = inner.mentions,
                tags = inner.tags,
                application = inner.application,
                language = inner.language,
                pinned = inner.pinned
            });
        }
示例#2
0
        public async Task <IActionResult> GetStatus(string id)
        {
            var userId = User.FindFirst(JwtTokenSettings.ActorClaim)?.Value;

            if (userId == null)
            {
                return(Unauthorized());
            }

            CollectionTools.EntityCollectionItem item = null;
            if (int.TryParse(id, out var idInt))
            {
                item = await _collectionTools.GetCollectionItem(idInt);
            }
            else
            {
                var ent = await _entityStore.GetEntity(Uri.UnescapeDataString(id), true);

                if (ent != null)
                {
                    item = new CollectionTools.EntityCollectionItem {
                        CollectionItemId = -1, Entity = ent
                    }
                }
                ;
            }

            if (item == null)
            {
                return(NotFound());
            }
            var translated = await _translateStatus(item);

            if (translated == null)
            {
                return(NotFound());
            }
            return(Json(translated));
        }
示例#3
0
        public async Task <IActionResult> GetStatusContext(string id)
        {
            var userId = User.FindFirst(JwtTokenSettings.ActorClaim)?.Value;

            if (userId == null)
            {
                return(Unauthorized());
            }

            CollectionTools.EntityCollectionItem item = null;
            if (int.TryParse(id, out var idInt))
            {
                item = await _collectionTools.GetCollectionItem(idInt);
            }
            else
            {
                var ent = await _entityStore.GetEntity(Uri.UnescapeDataString(id), true);

                if (ent != null)
                {
                    item = new CollectionTools.EntityCollectionItem {
                        CollectionItemId = -1, Entity = ent
                    }
                }
                ;
            }

            if (item.Entity.Data["object"].Any())
            {
                item.Entity = await _entityStore.GetEntity(item.Entity.Data["object"].First().Id, true);
            }

            if (item == null)
            {
                return(NotFound());
            }
            var res = new Mastodon.Context {
                ancestors = new List <Mastodon.Status>(), descendants = new List <Mastodon.Status>()
            };

            while (item.Entity.Data["inReplyTo"].Any())
            {
                var replyPost = await _entityStore.GetEntity(item.Entity.Data["inReplyTo"].First().Id, false);

                if (replyPost == null)
                {
                    break;
                }

                item.Entity = replyPost;
                var translated = await _translateStatus(item);

                if (translated != null)
                {
                    res.ancestors.Add(translated);
                }
            }

            res.ancestors.Reverse();

            return(Json(res));
        }
示例#4
0
        private async Task <Mastodon.Notification> _translateNotification(CollectionTools.EntityCollectionItem item)
        {
            var userId = User.FindFirst(JwtTokenSettings.ActorClaim).Value;

            if (item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Follow"))
            {
                return(new Mastodon.Notification
                {
                    id = item.CollectionItemId.ToString(),
                    type = "follow",
                    created_at = DateTime.Parse((string)item.Entity.Data["published"].FirstOrDefault()?.Primitive ?? item.Entity.Updated.ToString()),
                    account = await _processAccount(await _entityStore.GetEntity(item.Entity.Data["actor"].First().Id, true)),
                    status = null
                });
            }
            else if (item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Announce") || item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Like"))
            {
                var note = await _entityStore.GetEntity(item.Entity.Data["object"].First().Id, true);

                if (note == null || !note.Data["attributedTo"].Any(a => a.Id == userId))
                {
                    return(null);
                }

                var status = await _translateNote(note, null);

                if (status == null)
                {
                    return(null);
                }

                return(new Mastodon.Notification
                {
                    id = item.CollectionItemId.ToString(),
                    type = item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Announce") ? "reblog" : "favourite",
                    created_at = DateTime.Parse((string)item.Entity.Data["published"].FirstOrDefault()?.Primitive ?? item.Entity.Updated.ToString()),
                    account = await _processAccount(await _entityStore.GetEntity(item.Entity.Data["actor"].First().Id, true)),
                    status = status
                });
            }
            else if (item.Entity.Data.Type.Contains("https://www.w3.org/ns/activitystreams#Create"))
            {
                var note = await _entityStore.GetEntity(item.Entity.Data["object"].First().Id, true);

                if (note == null)
                {
                    return(null);
                }

                var status = await _translateNote(note, null);

                if (status == null)
                {
                    return(null);
                }

                return(new Mastodon.Notification
                {
                    id = item.CollectionItemId.ToString(),
                    type = "mention",
                    created_at = DateTime.Parse((string)item.Entity.Data["published"].FirstOrDefault()?.Primitive ?? DateTime.Now.ToString()),
                    account = await _processAccount(await _entityStore.GetEntity(item.Entity.Data["actor"].First().Id, true)),
                    status = status
                });
            }

            return(null);
        }