import gradio as gr import psycopg2 import pandas as pd DB_CONNECTION_STRING = "postgresql://aws-0-eu-central-1.pooler.supabase.com:6543/postgres" DB_USER = "postgres.fokjwzocbnlqjeifhrop" DB_PASSWORD = "72hj9eKQw5GBMHPn" # Connect to the PostgreSQL database def connect_db(): try: conn = psycopg2.connect( dbname="postgres", user=DB_USER, password=DB_PASSWORD, host=DB_CONNECTION_STRING.split("//")[1].split(":")[0], port=DB_CONNECTION_STRING.split(":")[-1].split("/")[0] ) return conn except Exception as e: print("Error connecting to database:", e) return None # Function to create HTML clickable links def make_clickable_wallet_number(df): df['wallet_number'] = df['wallet_number'].apply( lambda x: f'{x}' ) return gr.Dataframe(value=df, interactive=False, datatype="html") # Function to retrieve withdrawal requests def get_withdrawal_requests(filter_status=None): conn = connect_db() if conn is None: return pd.DataFrame() query = """ SELECT wr.request_id, wr.username, wr.amount, wr.status, wr.created_at, wr.completed_at, uw.wallet_number FROM withdrawal_requests wr JOIN user_wallet uw ON wr.wallet_id = uw.id """ if filter_status == "completed": query += " WHERE wr.status = 'completed'" elif filter_status == "incomplete": query += " WHERE wr.status = 'incomplete'" df = pd.read_sql(query, conn) conn.close() return df # Function to update the status of selected requests def update_request_status(selected_ids, new_status): conn = connect_db() if conn is None: return "Error: Could not connect to the database." try: with conn.cursor() as cursor: completed_at_fn = "NOW()" if new_status == "completed" else "NULL" update_query = f""" UPDATE withdrawal_requests SET status = %s, completed_at = {completed_at_fn} WHERE request_id = ANY(%s) """ cursor.execute(update_query, (new_status, "{" + selected_ids + "}")) conn.commit() return f"Updated {len(selected_ids.split(','))} requests to {new_status}." except Exception as e: conn.rollback() return f"Error: {e}" finally: conn.close() # Gradio interface functions def view_requests(filter_option): status_filter = None if filter_option == "Completed Requests": status_filter = "completed" elif filter_option == "Incomplete Requests": status_filter = "incomplete" df = get_withdrawal_requests(filter_status=status_filter) df = make_clickable_wallet_number(df) return df def change_status(selected_ids, new_status): message = update_request_status(selected_ids, new_status) return message # Function to retrieve application configurations def get_configurations(): conn = connect_db() if conn is None: return pd.DataFrame({"Error": ["Unable to connect to database"]}) try: query = "SELECT * FROM config WHERE id = 0" df = pd.read_sql(query, conn) print(df.to_string()) conn.close() return df except Exception as e: conn.close() return pd.DataFrame({"Error": [str(e)]}) # Function to update application configurations def update_configurations( ad_limit_per_day, spin_limit_per_day, ad_reward_steps, steps_limit, amount_limit_for_withdrawal, points_conversion_rate ): conn = connect_db() if conn is None: return "Error: Unable to connect to database." try: query = """ UPDATE config SET ad_limit_per_day = %s, spin_limit_per_day = %s, steps_limit = %s, points_conversion_rate = %s, ad_reward_steps = %s, amount_limit_for_withdrawal = %s WHERE id = 0 """ with conn.cursor() as cursor: cursor.execute(query, ( ad_limit_per_day, spin_limit_per_day, steps_limit, points_conversion_rate, ad_reward_steps, amount_limit_for_withdrawal )) conn.commit() return "Configuration updated successfully." except Exception as e: conn.rollback() return f"Error: {str(e)}" finally: conn.close() def get_milestones(): conn = connect_db() if conn is None: return pd.DataFrame({"Error": ["Unable to connect to database"]}) try: query = "SELECT * FROM reward_milestone" df = pd.read_sql(query, conn) print(df.to_string()) conn.close() return df except Exception as e: conn.close() return pd.DataFrame({"Error": [str(e)]}) # Function to update application configurations def update_milestones( req1, r1, req2, r2, req3, r3 ): conn = connect_db() if conn is None: return "Error: Unable to connect to database." try: milestones = [(req1, r1), (req2, r2), (req3, r3)] for i, milestone in enumerate(milestones): query = """ UPDATE reward_milestone SET required_steps = %s, reward = %s WHERE id = %s """ required_steps, reward = milestone with conn.cursor() as cursor: cursor.execute(query, ( required_steps, reward, i )) conn.commit() return "Configuration updated successfully." except Exception as e: conn.rollback() return f"Error: {str(e)}" finally: conn.close() # Gradio UI with gr.Blocks() as app: with gr.Tab("Withdrawal Requests"): gr.Markdown("# Withdrawal Requests Management") filter_option = gr.Radio( choices=["All Requests", "Completed Requests", "Incomplete Requests"], label="Filter Requests", value="All Requests" ) requests_table = gr.Dataframe( label="Withdrawal Requests", interactive=True ) refresh_button = gr.Button("Refresh") refresh_button.click( view_requests, inputs=filter_option, outputs=requests_table ) selected_ids = gr.Textbox(label="Selected Request IDs (comma-separated)", interactive=True) current_status = gr.Radio( choices=["incomplete", "completed"], label="Set Selected Requests to", value="incomplete" ) update_button = gr.Button("Update Status") status_message = gr.Textbox(label="Status Message", interactive=False) update_button.click( change_status, inputs=[selected_ids, current_status], outputs=status_message ) requests_table.value = view_requests("All Requests") with gr.Tab("General Configurations"): gr.Markdown("# Application Configurations") # Inputs for configuration fields ad_limit_per_day = gr.Number(label="Ad Limit Per Day", precision=0) spin_limit_per_day = gr.Number(label="Spin Limit Per Day", precision=0) steps_limit = gr.Number(label="Steps Limit", precision=0) points_conversion_rate = gr.Number(label="Points Conversion Rate", precision=0) ad_reward_steps = gr.Number(label="Ad Reward Steps", precision=0) amount_limit_for_withdrawal = gr.Number(label="Amount Limit for Withdrawal", precision=0) save_button = gr.Button("Save Configurations") config_message = gr.Textbox(label="Status Message", interactive=False) # Button to update configurations save_button.click( update_configurations, inputs=[ ad_limit_per_day, spin_limit_per_day, ad_reward_steps, steps_limit, amount_limit_for_withdrawal, points_conversion_rate ], outputs=config_message ) # Load current configurations def load_config(): df = get_configurations() if not df.empty: return df.iloc[0, 1:].to_list() return [0] * 6 load_button = gr.Button("Load Current Configurations") load_button.click( load_config, outputs=[ ad_limit_per_day, spin_limit_per_day, ad_reward_steps, steps_limit, amount_limit_for_withdrawal, points_conversion_rate ] ) with gr.Tab("Milestone Configurations"): gr.Markdown("# Application Configurations") # Inputs for configuration fields with gr.Row(): req_steps_1 = gr.Number(label="Needed Steps for Milestone 1", precision=0) reward_1 = gr.Number(label="Reward for Milestone 1", precision=0) with gr.Row(): req_steps_2 = gr.Number(label="Needed Steps for Milestone 2", precision=0) reward_2 = gr.Number(label="Reward for Milestone 2", precision=0) with gr.Row(): req_steps_3 = gr.Number(label="Needed Steps for Milestone 3", precision=0) reward_3 = gr.Number(label="Reward for Milestone 3", precision=0) save_button = gr.Button("Save Configurations") config_message = gr.Textbox(label="Status Message", interactive=False) # Button to update configurations save_button.click( update_milestones, inputs=[req_steps_1, reward_1, req_steps_2, reward_2, req_steps_3, reward_3], outputs=config_message ) # Load current configurations def load_milestones(): df = get_milestones() if not df.empty: return df[['required_steps', 'reward']].to_numpy().flatten().tolist() return [0] * 6 load_button = gr.Button("Load Current Configurations") load_button.click( load_milestones, outputs=[req_steps_1, reward_1, req_steps_2, reward_2, req_steps_3, reward_3], ) # Run the app app.launch()