async def get_discussions_by_hot(start_author: str, start_permlink: str = '', limit: int = 20, tag: str = None): limit = _validate_limit(limit, 20) ids = cursor.pids_by_query('hot', start_author, start_permlink, limit, tag) return _get_posts(ids)
async def get_state(path: str): """`get_state` reimplementation. See: https://github.com/steemit/steem/blob/06e67bd4aea73391123eca99e1a22a8612b0c47e/libraries/app/database_api.cpp#L1937 """ # pylint: disable=too-many-locals, too-many-branches, too-many-statements if path[0] == '/': path = path[1:] if not path: path = 'trending' part = path.split('/') if len(part) > 3: raise Exception("invalid path %s" % path) while len(part) < 3: part.append('') state = {} state['current_route'] = path state['props'] = _get_props_lite() state['tags'] = {} state['tag_idx'] = {} state['tag_idx']['trending'] = [] state['content'] = {} state['accounts'] = {} state['discussion_idx'] = {"": {}} state['feed_price'] = _get_feed_price() state1 = "{}".format(state) # account tabs (feed, blog, comments, replies) if part[0] and part[0][0] == '@': if not part[1]: part[1] = 'blog' if part[1] == 'transfers': raise Exception("transfers API not served by hive") if part[2]: raise Exception("unexpected account path part[2] %s" % path) account = part[0][1:] keys = { 'recent-replies': 'recent_replies', 'comments': 'comments', 'blog': 'blog', 'feed': 'feed' } if part[1] not in keys: raise Exception("invalid account path %s" % path) key = keys[part[1]] # TODO: use _load_accounts([account])? Examine issue w/ login account_obj = SteemClient.instance().get_accounts([account])[0] state['accounts'][account] = account_obj if key == 'recent_replies': posts = await get_replies_by_last_update(account, "", 20) elif key == 'comments': posts = await get_discussions_by_comments(account, "", 20) elif key == 'blog': posts = await get_discussions_by_blog(account, "", "", 20) elif key == 'feed': posts = await get_discussions_by_feed(account, "", "", 20) state['accounts'][account][key] = [] for post in posts: ref = post['author'] + '/' + post['permlink'] state['accounts'][account][key].append(ref) state['content'][ref] = post # discussion thread elif part[1] and part[1][0] == '@': author = part[1][1:] permlink = part[2] state['content'] = _load_discussion_recursive(author, permlink) accounts = set(map(lambda p: p['author'], state['content'].values())) state['accounts'] = {a['name']: a for a in _load_accounts(accounts)} # trending/etc pages elif part[0] in ['trending', 'promoted', 'hot', 'created']: if part[2]: raise Exception("unexpected discussion path part[2] %s" % path) sort = part[0] tag = part[1].lower() posts = cursor.pids_by_query(sort, '', '', 20, tag) state['discussion_idx'][tag] = {sort: []} for post in posts: ref = post['author'] + '/' + post['permlink'] state['content'][ref] = post state['discussion_idx'][tag][sort].append(ref) state['tag_idx']['trending'] = await _get_top_trending_tags() # witness list elif part[0] == 'witnesses': raise Exception("not implemented") # tag "explorer" elif part[0] == "tags": state['tag_idx']['trending'] = [] tags = await _get_trending_tags() for tag in tags: state['tag_idx']['trending'].append(tag['name']) state['tags'][tag['name']] = tag else: raise Exception("unknown path {}".format(path)) # (debug; should not happen) if state did not change, complain state2 = "{}".format(state) if state1 == state2: raise Exception("unrecognized path `{}`" % path) return state