summaryrefslogtreecommitdiffstats
path: root/openbb_terminal/common/behavioural_analysis/reddit_helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'openbb_terminal/common/behavioural_analysis/reddit_helpers.py')
-rw-r--r--openbb_terminal/common/behavioural_analysis/reddit_helpers.py174
1 files changed, 0 insertions, 174 deletions
diff --git a/openbb_terminal/common/behavioural_analysis/reddit_helpers.py b/openbb_terminal/common/behavioural_analysis/reddit_helpers.py
deleted file mode 100644
index c4fd0f2c759..00000000000
--- a/openbb_terminal/common/behavioural_analysis/reddit_helpers.py
+++ /dev/null
@@ -1,174 +0,0 @@
-"""Reddit Helpers."""
-
-__docformat__ = "numpy"
-
-import logging
-import re
-import urllib.request
-from typing import List
-
-import pandas as pd
-import praw
-from prawcore.exceptions import ResponseException
-
-from openbb_terminal.core.models import UserModel
-from openbb_terminal.rich_config import console
-
-logger = logging.getLogger(__name__)
-
-reddit_requirements = [
- "API_REDDIT_CLIENT_ID",
- "API_REDDIT_CLIENT_SECRET",
- "API_REDDIT_USERNAME",
- "API_REDDIT_USER_AGENT",
- "API_REDDIT_PASSWORD",
-]
-
-
-def find_tickers(submission: praw.models.reddit.submission.Submission) -> List[str]:
- """Extract potential tickers from reddit submission.
-
- Parameters
- ----------
- submission : praw.models.reddit.submission.Submission
- Reddit post to scan
-
- Returns
- -------
- List[str]
- List of potential tickers
- """
- ls_text = [submission.selftext, submission.title]
- submission.comments.replace_more(limit=0)
- for comment in submission.comments.list():
- ls_text.append(comment.body)
-
- l_tickers_found = []
- for s_text in ls_text:
- for s_ticker in set(re.findall(r"([A-Z]{3,5})", s_text)):
- l_tickers_found.append(s_ticker.strip())
-
- return l_tickers_found
-
-
-def get_praw_api(current_user: UserModel) -> praw.Reddit:
- """Get praw api.
-
- Parameters
- ----------
- current_user : UserModel
- The user model
-
- Returns
- -------
- praw.Reddit
- Praw api
- """
- # See https://github.com/praw-dev/praw/issues/1016 regarding praw arguments
- praw_api = praw.Reddit(
- client_id=current_user.credentials.API_REDDIT_CLIENT_ID,
- client_secret=current_user.credentials.API_REDDIT_CLIENT_SECRET,
- username=current_user.credentials.API_REDDIT_USERNAME,
- user_agent=current_user.credentials.API_REDDIT_USER_AGENT,
- password=current_user.credentials.API_REDDIT_PASSWORD,
- check_for_updates=False,
- comment_kind="t1",
- message_kind="t4",
- redditor_kind="t2",
- submission_kind="t3",
- subreddit_kind="t5",
- trophy_kind="t6",
- oauth_url="https://oauth.reddit.com",
- reddit_url="https://www.reddit.com",
- short_url="https://redd.it",
- ratelimit_seconds=5,
- timeout=16,
- )
- return praw_api
-
-
-def has_author(submission_, authors) -> bool:
- """Check if submission has author."""
- return (
- hasattr(submission_, "author")
- and hasattr(submission_.author, "name")
- and submission_.author.name not in authors
- )
-
-
-def has_content(submission_) -> bool:
- """Check if submission has text or title."""
- return hasattr(submission_, "selftext") or hasattr(submission_, "title")
-
-
-class RedditResponses:
- tickers: dict = {}
- authors: List[str] = []
-
- def __init__(self):
- pass
-
- def gather(self, praw_api, responses) -> int:
- count = 0
- for submission in responses:
- try:
- # Get more information about post using PRAW api
- submission_ = praw_api.submission(id=submission["id"])
-
- # Ensure that the post hasn't been removed by moderator in the meanwhile,
- # that there is a description and it's not just an image, that the flair is
- # meaningful, and that we aren't re-considering same author's content
-
- if (
- submission_ is not None
- and not submission_.removed_by_category
- and has_content(submission_)
- and has_author(submission_, self.authors)
- ):
- l_tickers_found = find_tickers(submission_)
-
- if l_tickers_found:
- count += len(l_tickers_found)
-
- # Add another author's name to the parsed watchlists
- self.authors.append(submission_.author.name)
-
- # Lookup stock tickers within a watchlist
- for key in l_tickers_found:
- if key in self.tickers:
- # Increment stock ticker found
- self.tickers[key] += 1
- else:
- # Initialize stock ticker found
- self.tickers[key] = 1
-
- except ResponseException as e:
- logger.exception("Invalid response: %s", str(e))
-
- if "received 401 HTTP response" in str(e):
- console.print("[red]Invalid API Key[/red]\n")
- else:
- console.print(f"[red]Invalid response: {str(e)}[/red]\n")
- return 0
- return count
-
- def validate(
- self,
- url: str = "https://raw.githubusercontent.com/rreichel3/US-Stock-Symbols/main/all/all_tickers.txt",
- ) -> None:
- """Validate tickers."""
- valids = []
- with urllib.request.urlopen(url) as file: # noqa: S310
- for line in file:
- new_item = line.decode("utf-8").replace("\n", "").strip()
- valids.append(new_item)
-
- for key in list(self.tickers.keys()):
- if key not in valids:
- self.tickers.pop(key)
-
- def to_df(self) -> pd.DataFrame:
- popularity = pd.DataFrame.from_dict(self.tickers, orient="index")
- popularity.columns = ["Mentions"]
- popularity = popularity.sort_values(by=["Mentions"], ascending=False)
- return popularity