{"action":"created","comment":{"url":"https://api.github.com/repos/discord-python/bot/pulls/comments/182769271","pull_request_review_id":113632792,"id":182769271,"diff_hunk":"@@ -0,0 +1,207 @@\n+import functools\n+import logging\n+import re\n+import sys\n+from collections import OrderedDict\n+from typing import Optional, Tuple\n+\n+import aiohttp\n+import discord\n+from bs4 import BeautifulSoup\n+from discord.ext import commands\n+from markdownify import MarkdownConverter\n+from sphinx.ext import intersphinx\n+\n+log = logging.getLogger(__name__)\n+\n+\n+BASE_URLS = {\n+    'aiohttp': \"https://aiohttp.readthedocs.io/en/stable/\",\n+    'discord': \"https://discordpy.readthedocs.io/en/rewrite/\",\n+    'django': \"https://docs.djangoproject.com/en/dev/\",\n+    'stdlib': \"https://docs.python.org/%d.%d/\" % sys.version_info[:2]\n+}\n+\n+INTERSPHINX_INVENTORIES = {\n+    'aiohttp': \"https://aiohttp.readthedocs.io/en/stable/objects.inv\",\n+    'discord': \"https://discordpy.readthedocs.io/en/rewrite/objects.inv\",\n+    'django': \"https://docs.djangoproject.com/en/dev/_objects/\",\n+    'stdlib': \"https://docs.python.org/%d.%d/objects.inv\" % sys.version_info[:2]\n+}\n+\n+UNWANTED_SIGNATURE_SYMBOLS = ('[source]', '¶')\n+WHITESPACE_AFTER_NEWLINES_RE = re.compile(r\"(?<=\\n\\n)( +)\")\n+\n+\n+def async_cache(max_size=128, arg_offset=0):\n+    \"\"\"\n+    LRU cache implementation for coroutines.\n+\n+    :param max_size:\n+    Specifies the maximum size the cache should have.\n+    Once it exceeds the maximum size, keys are deleted in FIFO order.\n+    :param arg_offset:\n+    The offset that should be applied to the coroutine's arguments\n+    when creating the cache key. Defaults to `0`.\n+    \"\"\"\n+\n+    cache = OrderedDict()\n+\n+    def decorator(function):\n+        @functools.wraps(function)\n+        async def wrapper(*args):\n+            key = ':'.join(args[arg_offset:])\n+\n+            value = cache.get(key)\n+            if value is None:\n+                if len(cache) > max_size:\n+                    cache.popitem(last=False)\n+\n+                cache[key] = await function(*args)\n+            return cache[key]\n+        return wrapper\n+    return decorator\n+\n+\n+class DocMarkdownConverter(MarkdownConverter):\n+    def convert_code(self, el, text):\n+        # Some part of `markdownify` believes that it should escape\n+        # underscored in variable names. I do not.\n+        return f\"`{text}`\".replace('\\\\', '')\n+\n+    def convert_pre(self, el, text):\n+        code = ''.join(el.strings)\n+        return f\"```py\\n{code}```\"\n+\n+\n+def markdownify(html):\n+    return DocMarkdownConverter(bullets='•').convert(html)\n+\n+\n+class DummyObject(object):\n+    pass\n+\n+\n+class SphinxConfiguration:\n+    config = DummyObject()\n+    config.intersphinx_timeout = 3\n+    config.tls_verify = True\n+\n+\n+class Doc:\n+    def __init__(self, bot):\n+        self.bot = bot\n+        self.client_session = aiohttp.ClientSession(loop=self.bot.loop)\n+        self.inventories = {}\n+        self.fetch_initial_inventory_data()\n+\n+    def __unload(self):\n+        if not self.client_session.closed:\n+            self.bot.loop.run_until_complete(self.client_session.close())\n+\n+    def fetch_initial_inventory_data(self):","path":"bot/cogs/doc.py","position":102,"original_position":102,"commit_id":"5fbe5eef586b824e27592ea41ba5bd1206c0f173","original_commit_id":"5fbe5eef586b824e27592ea41ba5bd1206c0f173","user":{"login":"martmists","id":16361449,"avatar_url":"https://avatars3.githubusercontent.com/u/16361449?v=4","gravatar_id":"","url":"https://api.github.com/users/martmists","html_url":"https://github.com/martmists","followers_url":"https://api.github.com/users/martmists/followers","following_url":"https://api.github.com/users/martmists/following{/other_user}","gists_url":"https://api.github.com/users/martmists/gists{/gist_id}","starred_url":"https://api.github.com/users/martmists/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martmists/subscriptions","organizations_url":"https://api.github.com/users/martmists/orgs","repos_url":"https://api.github.com/users/martmists/repos","events_url":"https://api.github.com/users/martmists/events{/privacy}","received_events_url":"https://api.github.com/users/martmists/received_events","type":"User","site_admin":false},"body":"Add comments to this","created_at":"2018-04-19T14:37:54Z","updated_at":"2018-04-19T14:42:08Z","html_url":"https://github.com/discord-python/bot/pull/53#discussion_r182769271","pull_request_url":"https://api.github.com/repos/discord-python/bot/pulls/53","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/discord-python/bot/pulls/comments/182769271"},"html":{"href":"https://github.com/discord-python/bot/pull/53#discussion_r182769271"},"pull_request":{"href":"https://api.github.com/repos/discord-python/bot/pulls/53"}}},"pull_request":{"url":"https://api.github.com/repos/discord-python/bot/pulls/53","id":182740024,"html_url":"https://github.com/discord-python/bot/pull/53","diff_url":"https://github.com/discord-python/bot/pull/53.diff","patch_url":"https://github.com/discord-python/bot/pull/53.patch","issue_url":"https://api.github.com/repos/discord-python/bot/issues/53","number":53,"state":"open","locked":false,"title":"Add documentation lookup support.","user":{"login":"Volcyy","id":22679924,"avatar_url":"https://avatars3.githubusercontent.com/u/22679924?v=4","gravatar_id":"","url":"https://api.github.com/users/Volcyy","html_url":"https://github.com/Volcyy","followers_url":"https://api.github.com/users/Volcyy/followers","following_url":"https://api.github.com/users/Volcyy/following{/other_user}","gists_url":"https://api.github.com/users/Volcyy/gists{/gist_id}","starred_url":"https://api.github.com/users/Volcyy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Volcyy/subscriptions","organizations_url":"https://api.github.com/users/Volcyy/orgs","repos_url":"https://api.github.com/users/Volcyy/repos","events_url":"https://api.github.com/users/Volcyy/events{/privacy}","received_events_url":"https://api.github.com/users/Volcyy/received_events","type":"User","site_admin":false},"body":"This PR aims to add what was described in #13 - it gives users the ability to look up Python documentation for various libraries. Technically, anything that has a Sphinx inventory file should be supported. The following currently work:\r\n- `aiohttp`\r\n- `discord` (rewrite branch)\r\n- `django`\r\n\r\nand the standard library. As for the implementation:\r\nOn startup, `intersphinx` fetches the specified inventory files and populates a dictionary with a mapping of `symbol` => `absolute_documentation_url`, for example `aiohttp.ClientSession.get` => `https://aiohttp.readthedocs.io/en/stable/client_reference.html#aiohttp.ClientSession.get`. When a user requests the symbol, the dictionary is checked for the key, and if it exists, the HTML is grabbed and passed to `BeautifulSoup`. BeautifulSoup will then parse the HTML and extract the documentation from the given `absolute_doc_url`, which is passed to `markdownify`, which in turn converts the HTML to Markdown that we can use in codeblocks.\r\n\r\nThis works, but I feel like it has a few small-ish problems:\r\n- The overall time from command invocation to bot response seems fairly high. I think that while we can't speed up the HTTP request, we could use the `lxml` parser with `BeautifulSoup` instead of the built-in `html.parser`, which should speed up the parsing. I did not add this yet, as it adds an external C dependency and may not be wanted ... would be happy to hear thoughts about this \r\n- Intersphinx inventories are only loaded on startup, but this takes around half a second per inventory. Right now, this sits at around 2 seconds total, but it may be nice to somehow run the requests concurrently - `intersphinx.fetch_inventory` could possibly be put in another function, which would then be run through `loop.run_in_executor`, for example\r\n```py\r\nawait asyncio.gather(await self.fetch_inventory(inv) for inv in INTERSPHINX_INVENTORIES)\r\n```\r\n- Formatting between docs is sometimes inconsistent. An example for this is `WHITESPACE_AFTER_NEWLINES_RE`, which is used to trim spaces that appeared after multiple newlines in some documentation, but some not.\r\n- `urllib3.connectionpool` does `DEBUG` logging inside of the `intersphinx.fetch_inventory` call. Is this okay, should this be suppressed? \r\n- A new `aiohttp.ClientSession` is made for each request. Should this be an instance attribute instead, or would it be a good idea to re-use the `self.bot`s client session? \r\n- I'm not sure how to get the Python syntax thing to work properly. When using `bot.doc('str.split')` for example, the command gets passed `\"str.split\"`, and when using `bot.doc 'str.split'`, the command gets passed `'str.split'`. Do I need to manually `strip` the quote characters? I mostly took `tags.get` as an example and it only appears to remove whitespace characters (default args to `strip`).\r\n\r\n\r\nOk, I think that's more than enough to lose your interest. So here's some (hopefully fancy) screenshots:\r\n\r\nScreenshots:\r\n![has_perms thing](https://cdn.discordapp.com/attachments/434048683135205387/436467044565647362/unknown.png)\r\n![cs get](https://cdn.discordapp.com/attachments/434048683135205387/436468183042621441/unknown.png)\r\n![split](https://cdn.discordapp.com/attachments/434048683135205387/436475669514289152/unknown.png)\r\n","created_at":"2018-04-19T11:01:11Z","updated_at":"2018-04-19T14:42:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3931d6b31f94aac98a4f2facb924b3d5eb69c16c","assignee":null,"assignees":[],"requested_reviewers":[{"login":"1mn","id":2098517,"avatar_url":"https://avatars2.githubusercontent.com/u/2098517?v=4","gravatar_id":"","url":"https://api.github.com/users/1mn","html_url":"https://github.com/1mn","followers_url":"https://api.github.com/users/1mn/followers","following_url":"https://api.github.com/users/1mn/following{/other_user}","gists_url":"https://api.github.com/users/1mn/gists{/gist_id}","starred_url":"https://api.github.com/users/1mn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/1mn/subscriptions","organizations_url":"https://api.github.com/users/1mn/orgs","repos_url":"https://api.github.com/users/1mn/repos","events_url":"https://api.github.com/users/1mn/events{/privacy}","received_events_url":"https://api.github.com/users/1mn/received_events","type":"User","site_admin":false},{"login":"AnonGuy","id":25161069,"avatar_url":"https://avatars3.githubusercontent.com/u/25161069?v=4","gravatar_id":"","url":"https://api.github.com/users/AnonGuy","html_url":"https://github.com/AnonGuy","followers_url":"https://api.github.com/users/AnonGuy/followers","following_url":"https://api.github.com/users/AnonGuy/following{/other_user}","gists_url":"https://api.github.com/users/AnonGuy/gists{/gist_id}","starred_url":"https://api.github.com/users/AnonGuy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnonGuy/subscriptions","organizations_url":"https://api.github.com/users/AnonGuy/orgs","repos_url":"https://api.github.com/users/AnonGuy/repos","events_url":"https://api.github.com/users/AnonGuy/events{/privacy}","received_events_url":"https://api.github.com/users/AnonGuy/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/discord-python/bot/pulls/53/commits","review_comments_url":"https://api.github.com/repos/discord-python/bot/pulls/53/comments","review_comment_url":"https://api.github.com/repos/discord-python/bot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/discord-python/bot/issues/53/comments","statuses_url":"https://api.github.com/repos/discord-python/bot/statuses/5fbe5eef586b824e27592ea41ba5bd1206c0f173","head":{"label":"discord-python:pydoc-support","ref":"pydoc-support","sha":"5fbe5eef586b824e27592ea41ba5bd1206c0f173","user":{"login":"discord-python","id":36101493,"avatar_url":"https://avatars0.githubusercontent.com/u/36101493?v=4","gravatar_id":"","url":"https://api.github.com/users/discord-python","html_url":"https://github.com/discord-python","followers_url":"https://api.github.com/users/discord-python/followers","following_url":"https://api.github.com/users/discord-python/following{/other_user}","gists_url":"https://api.github.com/users/discord-python/gists{/gist_id}","starred_url":"https://api.github.com/users/discord-python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/discord-python/subscriptions","organizations_url":"https://api.github.com/users/discord-python/orgs","repos_url":"https://api.github.com/users/discord-python/repos","events_url":"https://api.github.com/users/discord-python/events{/privacy}","received_events_url":"https://api.github.com/users/discord-python/received_events","type":"Organization","site_admin":false},"repo":{"id":120088519,"name":"bot","full_name":"discord-python/bot","owner":{"login":"discord-python","id":36101493,"avatar_url":"https://avatars0.githubusercontent.com/u/36101493?v=4","gravatar_id":"","url":"https://api.github.com/users/discord-python","html_url":"https://github.com/discord-python","followers_url":"https://api.github.com/users/discord-python/followers","following_url":"https://api.github.com/users/discord-python/following{/other_user}","gists_url":"https://api.github.com/users/discord-python/gists{/gist_id}","starred_url":"https://api.github.com/users/discord-python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/discord-python/subscriptions","organizations_url":"https://api.github.com/users/discord-python/orgs","repos_url":"https://api.github.com/users/discord-python/repos","events_url":"https://api.github.com/users/discord-python/events{/privacy}","received_events_url":"https://api.github.com/users/discord-python/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/discord-python/bot","description":"Source code for our Discord bot","fork":false,"url":"https://api.github.com/repos/discord-python/bot","forks_url":"https://api.github.com/repos/discord-python/bot/forks","keys_url":"https://api.github.com/repos/discord-python/bot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/discord-python/bot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/discord-python/bot/teams","hooks_url":"https://api.github.com/repos/discord-python/bot/hooks","issue_events_url":"https://api.github.com/repos/discord-python/bot/issues/events{/number}","events_url":"https://api.github.com/repos/discord-python/bot/events","assignees_url":"https://api.github.com/repos/discord-python/bot/assignees{/user}","branches_url":"https://api.github.com/repos/discord-python/bot/branches{/branch}","tags_url":"https://api.github.com/repos/discord-python/bot/tags","blobs_url":"https://api.github.com/repos/discord-python/bot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/discord-python/bot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/discord-python/bot/git/refs{/sha}","trees_url":"https://api.github.com/repos/discord-python/bot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/discord-python/bot/statuses/{sha}","languages_url":"https://api.github.com/repos/discord-python/bot/languages","stargazers_url":"https://api.github.com/repos/discord-python/bot/stargazers","contributors_url":"https://api.github.com/repos/discord-python/bot/contributors","subscribers_url":"https://api.github.com/repos/discord-python/bot/subscribers","subscription_url":"https://api.github.com/repos/discord-python/bot/subscription","commits_url":"https://api.github.com/repos/discord-python/bot/commits{/sha}","git_commits_url":"https://api.github.com/repos/discord-python/bot/git/commits{/sha}","comments_url":"https://api.github.com/repos/discord-python/bot/comments{/number}","issue_comment_url":"https://api.github.com/repos/discord-python/bot/issues/comments{/number}","contents_url":"https://api.github.com/repos/discord-python/bot/contents/{+path}","compare_url":"https://api.github.com/repos/discord-python/bot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/discord-python/bot/merges","archive_url":"https://api.github.com/repos/discord-python/bot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/discord-python/bot/downloads","issues_url":"https://api.github.com/repos/discord-python/bot/issues{/number}","pulls_url":"https://api.github.com/repos/discord-python/bot/pulls{/number}","milestones_url":"https://api.github.com/repos/discord-python/bot/milestones{/number}","notifications_url":"https://api.github.com/repos/discord-python/bot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/discord-python/bot/labels{/name}","releases_url":"https://api.github.com/repos/discord-python/bot/releases{/id}","deployments_url":"https://api.github.com/repos/discord-python/bot/deployments","created_at":"2018-02-03T12:20:25Z","updated_at":"2018-04-19T08:12:52Z","pushed_at":"2018-04-19T13:18:35Z","git_url":"git://github.com/discord-python/bot.git","ssh_url":"git@github.com:discord-python/bot.git","clone_url":"https://github.com/discord-python/bot.git","svn_url":"https://github.com/discord-python/bot","homepage":"","size":231,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":6,"open_issues":8,"watchers":15,"default_branch":"master"}},"base":{"label":"discord-python:master","ref":"master","sha":"9cc874d34ad23d341c5b25dcb9877adcaf0b193e","user":{"login":"discord-python","id":36101493,"avatar_url":"https://avatars0.githubusercontent.com/u/36101493?v=4","gravatar_id":"","url":"https://api.github.com/users/discord-python","html_url":"https://github.com/discord-python","followers_url":"https://api.github.com/users/discord-python/followers","following_url":"https://api.github.com/users/discord-python/following{/other_user}","gists_url":"https://api.github.com/users/discord-python/gists{/gist_id}","starred_url":"https://api.github.com/users/discord-python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/discord-python/subscriptions","organizations_url":"https://api.github.com/users/discord-python/orgs","repos_url":"https://api.github.com/users/discord-python/repos","events_url":"https://api.github.com/users/discord-python/events{/privacy}","received_events_url":"https://api.github.com/users/discord-python/received_events","type":"Organization","site_admin":false},"repo":{"id":120088519,"name":"bot","full_name":"discord-python/bot","owner":{"login":"discord-python","id":36101493,"avatar_url":"https://avatars0.githubusercontent.com/u/36101493?v=4","gravatar_id":"","url":"https://api.github.com/users/discord-python","html_url":"https://github.com/discord-python","followers_url":"https://api.github.com/users/discord-python/followers","following_url":"https://api.github.com/users/discord-python/following{/other_user}","gists_url":"https://api.github.com/users/discord-python/gists{/gist_id}","starred_url":"https://api.github.com/users/discord-python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/discord-python/subscriptions","organizations_url":"https://api.github.com/users/discord-python/orgs","repos_url":"https://api.github.com/users/discord-python/repos","events_url":"https://api.github.com/users/discord-python/events{/privacy}","received_events_url":"https://api.github.com/users/discord-python/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/discord-python/bot","description":"Source code for our Discord bot","fork":false,"url":"https://api.github.com/repos/discord-python/bot","forks_url":"https://api.github.com/repos/discord-python/bot/forks","keys_url":"https://api.github.com/repos/discord-python/bot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/discord-python/bot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/discord-python/bot/teams","hooks_url":"https://api.github.com/repos/discord-python/bot/hooks","issue_events_url":"https://api.github.com/repos/discord-python/bot/issues/events{/number}","events_url":"https://api.github.com/repos/discord-python/bot/events","assignees_url":"https://api.github.com/repos/discord-python/bot/assignees{/user}","branches_url":"https://api.github.com/repos/discord-python/bot/branches{/branch}","tags_url":"https://api.github.com/repos/discord-python/bot/tags","blobs_url":"https://api.github.com/repos/discord-python/bot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/discord-python/bot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/discord-python/bot/git/refs{/sha}","trees_url":"https://api.github.com/repos/discord-python/bot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/discord-python/bot/statuses/{sha}","languages_url":"https://api.github.com/repos/discord-python/bot/languages","stargazers_url":"https://api.github.com/repos/discord-python/bot/stargazers","contributors_url":"https://api.github.com/repos/discord-python/bot/contributors","subscribers_url":"https://api.github.com/repos/discord-python/bot/subscribers","subscription_url":"https://api.github.com/repos/discord-python/bot/subscription","commits_url":"https://api.github.com/repos/discord-python/bot/commits{/sha}","git_commits_url":"https://api.github.com/repos/discord-python/bot/git/commits{/sha}","comments_url":"https://api.github.com/repos/discord-python/bot/comments{/number}","issue_comment_url":"https://api.github.com/repos/discord-python/bot/issues/comments{/number}","contents_url":"https://api.github.com/repos/discord-python/bot/contents/{+path}","compare_url":"https://api.github.com/repos/discord-python/bot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/discord-python/bot/merges","archive_url":"https://api.github.com/repos/discord-python/bot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/discord-python/bot/downloads","issues_url":"https://api.github.com/repos/discord-python/bot/issues{/number}","pulls_url":"https://api.github.com/repos/discord-python/bot/pulls{/number}","milestones_url":"https://api.github.com/repos/discord-python/bot/milestones{/number}","notifications_url":"https://api.github.com/repos/discord-python/bot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/discord-python/bot/labels{/name}","releases_url":"https://api.github.com/repos/discord-python/bot/releases{/id}","deployments_url":"https://api.github.com/repos/discord-python/bot/deployments","created_at":"2018-02-03T12:20:25Z","updated_at":"2018-04-19T08:12:52Z","pushed_at":"2018-04-19T13:18:35Z","git_url":"git://github.com/discord-python/bot.git","ssh_url":"git@github.com:discord-python/bot.git","clone_url":"https://github.com/discord-python/bot.git","svn_url":"https://github.com/discord-python/bot","homepage":"","size":231,"stargazers_count":15,"watchers_count":15,"language":"Python","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":8,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":6,"open_issues":8,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/discord-python/bot/pulls/53"},"html":{"href":"https://github.com/discord-python/bot/pull/53"},"issue":{"href":"https://api.github.com/repos/discord-python/bot/issues/53"},"comments":{"href":"https://api.github.com/repos/discord-python/bot/issues/53/comments"},"review_comments":{"href":"https://api.github.com/repos/discord-python/bot/pulls/53/comments"},"review_comment":{"href":"https://api.github.com/repos/discord-python/bot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/discord-python/bot/pulls/53/commits"},"statuses":{"href":"https://api.github.com/repos/discord-python/bot/statuses/5fbe5eef586b824e27592ea41ba5bd1206c0f173"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"martmists"}}