def __init__(self, app_dir, main_menu, camera, theme_mgr, widget_properties, \ config, player=None): Menu.__init__(self, widget_properties) self.main_menu = main_menu self.app_dir = app_dir self.camera = camera # self.theme_mgr = theme_mgr self.player = player # self.menu_list = {} # self.menu_list['singscreen'] = self self.config = config
def __init__(self, widget_props, song_data=None, \ player=None, keyboard_event=None, song=None, \ song_event=None): Menu.__init__(self, widget_props) l_continue = _(u'continue singing') l_quit = _(u'quit song') self.song_data = song_data self.song = song self.player = player self.keyboard_event = keyboard_event self.song_event = song_event
def __init__(self, widget_properties): Menu.__init__(self, widget_properties) l_next = _(u'next >>') l_prev = _(u'<< previous') self.prev_button = MenuButton(label=l_prev, \ widget_properties=self.widget_properties) self.next_button = MenuButton(l_next, \ widget_properties=self.widget_properties) self.add(self.prev_button, 'center') self.add(self.next_button, 'center') # self.bc_top = self.nc_top + 10 + self.nc_height # self.bc_left = 20 # self.bc_width = self.screen_res_x - 40 # self.bc_height = self.screen_res_y - self.bc_top - 25 # self.bc_right = 20 # self.bc_bottom = 30 # self.box_cont = pudding.container.Container( \ # self, left=self.bc_left, top=self.bc_top, \ # width=self.bc_width, height=self.bc_height, \ # right=self.bc_right) # self.bg_box = pudding.control.Box(self.box_cont, \ # width=self.bc_width, \ # height=self.bc_height, \ # background_color=self.box_bg_color, \ # border_color=self.box_border_color, \ # z_index=-3) # self.bg_box.anchors = pudding.ANCHOR_ALL # self.directory_cont = pudding.container.HorizontalContainer( \ # self.box_cont, top=self.height * 0.02, \ # right=self.right, width=self.width, \ # height=self.height, left=0) pos_size = {} pos_size['top'] = 0 pos_size['left'] = 0 # pos_size['height'] = self.height * 0.05 # pos_size['width'] = self.width * 0.3 # self.directory_cont.anchors = pudding.ANCHOR_ALL # self.directory_cont.padding = 10 # self.directory_up_button = MenuButton("<<", \ # widget_properties = self.widget_properties, pos_size=pos_size) # self.directory_cont.add_child(self.directory_up_button, \ # pudding.ALIGN_LEFT) pos_size = {} pos_size['top'] = 0
def __init__(self, app_dir, widget_properties, theme_mgr, main_menu, player): Menu.__init__(self, widget_properties) self.l_help_hint_0 = _(u'Press [h] for help...') self.l_help_hint_1 = _(u'Press [ESC] to go back...') self.l_help_hint = self.l_help_hint_0 self.l_bpm = _(u'BPM: ') self.l_line_no = _(u'Line: ') self.separator = u' - ' self.h_help = _(u'Help') self.help_file_path = os.path.join(app_dir, 'misc', 'HELP.txt') self.widget_properties = widget_properties self.app_dir = app_dir #self.parent_widget = widget_properties['root_widget'] self.theme_mgr = theme_mgr self.screen_res_x = int(widget_properties['config']['screen']['resolution'].split('x')[0]) self.screen_res_y = int(widget_properties['config']['screen']['resolution'].split('x')[1]) # self.font_p = widget_properties['font']['p']['obj'] # self.color_p = widget_properties['font']['p']['color'] # self.font_h = widget_properties['font']['h1']['obj'] # self.color_h = widget_properties['font']['h1']['color'] self.main_menu = main_menu # self.help_hint_cont = pudding.container.VerticalContainer( \ # self, left=self.screen_res_x / 2.5, top=5) # self.help_hint_cont.right = 10 # self.help_hint_cont.anchors = pudding.ANCHOR_ALL # self.keyboard_event = KeyboardEvent(self.widget_properties, theme_mgr) self.txt_input = InputField(self.widget_properties, '') # self.txt_input.label.visible = 0 self.player = player self.__connect_keys__() self.msg = dict()
class StateDialog(State): # Options OPTION_OK = 1 OPTION_CANCEL = 1 << 1 OPTION_OK_CANCEL = OPTION_OK | OPTION_CANCEL def __init__(self, context, layout, callback): super(StateDialog, self).__init__(context) # Settings self._size = (context.main_screen.get_maxsize()[0] - 1, 40) # Outside function to handle input data on confirm self._return_handler_func = callback # Menu self._menu = Menu() self._menu.set_position(2, 2) if layout['options'] & StateDialog.OPTION_OK: self._menu.add_entry('OK', self.on_option_selected, StateDialog.OPTION_OK) if layout['options'] & StateDialog.OPTION_CANCEL: self._menu.add_entry('Cancel', self.on_option_selected, StateDialog.OPTION_CANCEL) # Setup self._header = ['', '', ''] self.__spawn_layout(layout) # Base def on_input(self, key_code): self._menu.on_input(key_code) def on_update(self, dt): pass def on_render(self, screen): # Frame screen.put_string(0, 0, self._header[0]) screen.put_string(1, 0, self._header[1]) screen.put_string(self._size[0] - 1, 0, self._header[2]) for i in range(2, self._size[0] - 1): screen.put_string(i, 0, '│') screen.put_string(i, self._size[1] - 1, '│') # Menu self._menu.on_render(screen) # On event def on_option_selected(self, option): self.pop_this_state() self._return_handler_func(option) def __spawn_layout(self, layout): self._header[0] = '│ {} │'.format(layout['title'].ljust(self._size[1] - 4)) self._header[1] = '├' + ('─' * (self._size[1] - 2)) + '┤' self._header[2] = '└' + ('─' * (self._size[1] - 2)) + '┘'
def __init__(self, game): Menu.__init__(self, game) self.game = game
async def est_command(ctx, ticker: str = ""): """Displays earning estimates [Business Insider]""" try: # Debug if cfg.DEBUG: logger.debug("!stocks.dd.est %s", ticker) # Check for argument if ticker == "": raise Exception("Stock ticker is required") ( df_year_estimates, df_quarter_earnings, df_quarter_revenues, ) = business_insider_model.get_estimates(ticker) if (df_quarter_revenues.empty and df_year_estimates.empty and df_quarter_earnings.empty): raise Exception("Enter a valid ticker") # Debug user output if cfg.DEBUG: logger.debug(df_year_estimates.to_string()) logger.debug(df_quarter_earnings.to_string()) logger.debug(df_quarter_revenues.to_string()) dindex = len(df_year_estimates.index) fig = df2img.plot_dataframe( df_year_estimates, fig_size=(1200, (40 + (60 * dindex))), col_width=[12, 4, 4, 4, 4], tbl_cells=dict(height=35, ), font=dict( family="Consolas", size=20, ), template="plotly_dark", paper_bgcolor="rgba(0, 0, 0, 0)", ) imagefile = "estimates.png" df2img.save_dataframe(fig=fig, filename=imagefile) image = Image.open(imagefile) image = autocrop_image(image, 0) image.save(imagefile, "PNG", quality=100) uploaded_image = gst_imgur.upload_image(imagefile, title="something") link_estimates = uploaded_image.link os.remove(imagefile) fig = df2img.plot_dataframe( df_quarter_earnings, fig_size=(1200, (40 + (40 * 20))), col_width=[5, 5, 4, 4, 5, 4], tbl_cells=dict(height=35, ), font=dict( family="Consolas", size=20, ), template="plotly_dark", paper_bgcolor="rgba(0, 0, 0, 0)", ) imagefile = "earnings.png" df2img.save_dataframe(fig=fig, filename=imagefile) image = Image.open(imagefile) image = autocrop_image(image, 0) image.save(imagefile, "PNG", quality=100) uploaded_image = gst_imgur.upload_image(imagefile, title="something") link_earnings = uploaded_image.link os.remove(imagefile) fig = df2img.plot_dataframe( df_quarter_revenues, fig_size=(1200, (40 + (40 * 20))), col_width=[5, 5, 4, 4, 5, 4], tbl_cells=dict(height=35, ), font=dict( family="Consolas", size=20, ), template="plotly_dark", paper_bgcolor="rgba(0, 0, 0, 0)", ) imagefile = "revenues.png" df2img.save_dataframe(fig=fig, filename=imagefile) image = Image.open(imagefile) image = autocrop_image(image, 0) image.save(imagefile, "PNG", quality=100) uploaded_image = gst_imgur.upload_image(imagefile, title="something") link_revenues = uploaded_image.link os.remove(imagefile) embeds = [ disnake.Embed( title=f"**{ticker.upper()} Year Estimates**", color=cfg.COLOR, ), disnake.Embed( title=f"**{ticker.upper()} Quarter Earnings**", colour=cfg.COLOR, ), disnake.Embed( title=f"**{ticker.upper()} Quarter Revenues**", colour=cfg.COLOR, ), ] embeds[0].set_image(url=link_estimates) embeds[1].set_image(url=link_earnings) embeds[2].set_image(url=link_revenues) # Output data choices = [ disnake.SelectOption(label=f"{ticker.upper()} Year Estimates", value="0", emoji="🟢"), disnake.SelectOption(label=f"{ticker.upper()} Quarter Earnings", value="1", emoji="🟢"), disnake.SelectOption(label=f"{ticker.upper()} Quarter Revenues", value="2", emoji="🟢"), ] await ctx.send(embed=embeds[0], view=Menu(embeds, choices)) except Exception as e: embed = disnake.Embed( title="ERROR Stocks: [Business Insider] Earning Estimates", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)
async def hsi_command(ctx, num: int = 10): """Show top high short interest stocks of over 20% ratio [shortinterest.com]""" try: # Debug user input if cfg.DEBUG: logger.debug("!stocks.dps.hsi %s", num) # Check for argument if num < 0: raise Exception("Number has to be above 0") # Retrieve data df = shortinterest_model.get_high_short_interest() df = df.iloc[1:].head(n=num) # Debug user output if cfg.DEBUG: logger.debug(df.to_string()) # Output data future_column_name = df["Ticker"] df = df.transpose() df.columns = future_column_name df.drop("Ticker") columns = [] choices = [ disnake.SelectOption(label="Overview", value="0", emoji="🟢"), ] initial_str = "Overview" i = 1 for col_name in df.columns.values: menu = f"\nPage {i}: {col_name}" initial_str += f"\nPage {i}: {col_name}" choices.append( disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), ) i += 1 columns.append( disnake.Embed( title="Stocks: [highshortinterest.com] Top High Short Interest", description=initial_str, colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, )) for column in df.columns.values: columns.append( disnake.Embed( title= "Stocks: [highshortinterest.com] Top High Short Interest", description="```" + df[column].fillna("").to_string() + "```", colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, )) await ctx.send(embed=columns[0], view=Menu(columns, choices)) except Exception as e: embed = disnake.Embed( title= "ERROR Stocks: [highshortinterest.com] Top High Short Interest", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)
async def lins_command(ctx, ticker: str = "", num: int = 10): """Display insider activity for a given stock ticker. [Source: Finviz] Parameters ---------- ticker : Stock Ticker num : Number of latest insider activity to display """ try: # Debug if cfg.DEBUG: logger.debug("disc-lins %s", num) d_finviz_insider = finviz_model.get_last_insider_activity(ticker) df = pd.DataFrame.from_dict(d_finviz_insider) df.set_index("Date", inplace=True) df = df[ [ "Relationship", "Transaction", "#Shares", "Cost", "Value ($)", "#Shares Total", "Insider Trading", "SEC Form 4", ] ] df = df.head(num) df = df.replace(to_replace="Option Exercise", value="Opt Ex.", regex=True) title = f"Insider Trading for {ticker.upper()}" embeds: list = [] i, i2, end = 0, 0, 20 df_pg = [] embeds_img = [] dindex = len(df.index) while i < dindex: df_pg = df.iloc[i:end] df_pg.append(df_pg) fig = df2img.plot_dataframe( df_pg, fig_size=(1600, (40 + (40 * 20))), col_width=[5, 14, 4, 4, 3, 4, 5, 8, 7], tbl_cells=dict( height=35, ), font=dict( family="Consolas", size=20, ), template="plotly_dark", paper_bgcolor="rgba(0, 0, 0, 0)", ) imagefile = f"disc-insider{i}.png" df2img.save_dataframe(fig=fig, filename=imagefile) image = Image.open(imagefile) image = autocrop_image(image, 0) image.save(imagefile, "PNG", quality=100) uploaded_image = gst_imgur.upload_image(imagefile, title="something") image_link = uploaded_image.link embeds_img.append( f"{image_link}", ) embeds.append( disnake.Embed( title=title, colour=cfg.COLOR, ), ) i2 += 1 i += 20 end += 20 os.remove(imagefile) # Author/Footer for i in range(0, i2): embeds[i].set_author( name=cfg.AUTHOR_NAME, url=cfg.AUTHOR_URL, icon_url=cfg.AUTHOR_ICON_URL, ) embeds[i].set_footer( text=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) i = 0 for i in range(0, i2): embeds[i].set_image(url=embeds_img[i]) i += 1 embeds[0].set_footer(text=f"Page 1 of {len(embeds)}") options = [ disnake.SelectOption(label="Home", value="0", emoji="🟢"), ] await ctx.send(embed=embeds[0], view=Menu(embeds, options)) except Exception as e: embed = disnake.Embed( title="ERROR Insider Activity [Source: Finviz]", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)
async def sidtc_command(ctx, sort="float", num: int = 10): """Short interest and days to cover [Stockgrid]""" try: # Debug if cfg.DEBUG: logger.debug("!stocks.dps.sidtc %s %s", sort, num) # Check for argument possible_sorts = ("float", "dtc", "si") if sort not in possible_sorts: raise Exception(f"The possible sorts are: {', '.join(possible_sorts)}") if num < 0: raise Exception("Number has to be above 0") # Retrieve data df = stockgrid_model.get_short_interest_days_to_cover(sort) df = df.iloc[:num] # Debug user output if cfg.DEBUG: logger.debug(df.to_string()) # Output data dp_date = df["Date"].values[0] df = df.drop(columns=["Date"]) df["Short Interest"] = df["Short Interest"] / 1_000_000 df.head() df.columns = [ "Ticker", "Float Short %", "Days to Cover", "Short Interest (1M)", ] future_column_name = df["Ticker"] df = df.transpose() df.columns = future_column_name df.drop("Ticker") columns = [] choices = [ disnake.SelectOption(label="Overview", value="0", emoji="🟢"), ] initial_str = "Overview" i = 1 for col_name in df.columns.values: menu = f"\nPage {i}: {col_name}" initial_str += f"\nPage {i}: {col_name}" if i < 19: choices.append( disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), ) if i == 20: choices.append( disnake.SelectOption(label="Max Reached", value=f"{i}", emoji="🟢"), ) i += 1 columns.append( disnake.Embed( title="Dark Pool Shorts", description=initial_str, colour=cfg.COLOR ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) ) for column in df.columns.values: columns.append( disnake.Embed( title="Stocks: [Stockgrid] Short Interest and Days to Cover", description="```The following data corresponds to the date: " + dp_date + "\n\n" + df[column].fillna("").to_string() + "```", colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) ) await ctx.send(embed=columns[0], view=Menu(columns, choices)) except Exception as e: embed = disnake.Embed( title="ERROR Stocks: [Stockgrid] Short Interest and Days to Cover", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)
async def lastcontracts_command(ctx, past_transactions_days: int = 2, num: int = 20): """Displays last government contracts [quiverquant.com]""" try: # Debug user input if cfg.DEBUG: logger.debug("!stocks.gov.lastcontracts %s %s", past_transactions_days, num) df_contracts = quiverquant_model.get_government_trading("contracts") if df_contracts.empty: logger.debug("No government contracts found") return df_contracts.sort_values("Date", ascending=False) df_contracts["Date"] = pd.to_datetime(df_contracts["Date"]) df_contracts["Date"] = df_contracts["Date"].dt.date df_contracts.drop_duplicates(inplace=True) df_contracts = df_contracts[df_contracts["Date"].isin( df_contracts["Date"].unique()[:past_transactions_days])] df_contracts = df_contracts[["Date", "Ticker", "Amount", "Agency"]][:num] choices = [ disnake.SelectOption(label="Overview", value="0", emoji="🟢"), ] initial_str = "Overview" i = 1 for col_name in df_contracts["Ticker"].values: menu = f"\nPage {i}: {col_name}" initial_str += f"\nPage {i}: {col_name}" choices.append( disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), ) i += 1 columns = [] df_contracts = df_contracts.T columns.append( disnake.Embed( title="Stocks: [quiverquant.com] Top buy government trading", description=initial_str, colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, )) for column in df_contracts.columns.values: columns.append( disnake.Embed( description="```" + df_contracts[column].fillna("").to_string() + "```", colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, )) await ctx.send(embed=columns[0], view=Menu(columns, choices)) except Exception as e: embed = disnake.Embed( title="ERROR Stocks: [quiverquant.com] Top buy government trading", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)
def __init__(self, game): Menu.__init__(self, game)
async def valuation_command( ctx, preset: str = "template", sort: str = "", limit: int = 5, ascend: bool = False ): """Displays results from chosen preset focusing on valuation metrics [Finviz]""" try: # Check for argument if preset == "template" or preset not in so.all_presets: raise Exception("Invalid preset selected!") # Debug if cfg.DEBUG: logger.debug( "!stocks.scr.valuation %s %s %s %s", preset, sort, limit, ascend ) # Check for argument if limit < 0: raise Exception("Number has to be above 0") # Output Data df_screen = get_screener_data( preset, "valuation", limit, ascend, ) description = "" if isinstance(df_screen, pd.DataFrame): if df_screen.empty: return [] df_screen = df_screen.dropna(axis="columns", how="all") if sort: if " ".join(sort) in so.d_cols_to_sort["valuation"]: df_screen = df_screen.sort_values( by=[" ".join(sort)], ascending=ascend, na_position="last", ) else: similar_cmd = difflib.get_close_matches( " ".join(sort), so.d_cols_to_sort["valuation"], n=1, cutoff=0.7, ) if similar_cmd: description = f"Replacing '{' '.join(sort)}' by '{similar_cmd[0]}' so table can be sorted.\n\n" df_screen = df_screen.sort_values( by=[similar_cmd[0]], ascending=ascend, na_position="last", ) else: raise ValueError( f"Wrong sort column provided! Select from: {', '.join(so.d_cols_to_sort['valuation'])}" ) df_screen = df_screen.fillna("") future_column_name = df_screen["Ticker"] df_screen = df_screen.head(n=limit).transpose() df_screen.columns = future_column_name df_screen.drop("Ticker") columns = [] choices = [ disnake.SelectOption(label="Overview", value="0", emoji="🟢"), ] initial_str = description + "Overview" i = 1 for column in df_screen.columns.values: menu = f"\nPage {i}: {column}" initial_str += f"\nPage {i}: {column}" if i < 19: choices.append( disnake.SelectOption(label=menu, value=f"{i}", emoji="🟢"), ) if i == 20: choices.append( disnake.SelectOption( label="Max Reached", value=f"{i}", emoji="🟢" ), ) i += 1 columns.append( disnake.Embed( title="Stocks: [Finviz] Valuation Screener", description=initial_str, colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) ) for column in df_screen.columns.values: columns.append( disnake.Embed( title="Stocks: [Finviz] Valuation Screener", description="```" + df_screen[column].fillna("").to_string() + "```", colour=cfg.COLOR, ).set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) ) await ctx.send(embed=columns[0], view=Menu(columns, choices)) except Exception as e: embed = disnake.Embed( title="ERROR Stocks: [Finviz] Valuation Screener", colour=cfg.COLOR, description=e, ) embed.set_author( name=cfg.AUTHOR_NAME, icon_url=cfg.AUTHOR_ICON_URL, ) await ctx.send(embed=embed, delete_after=30.0)