File size: 3,386 Bytes
ccec886
ddbc9ac
9034804
ddbc9ac
 
 
128003a
b85b6b9
afc2013
128003a
ddbc9ac
 
a04ed72
ddbc9ac
 
128003a
 
 
ddbc9ac
 
 
 
128003a
 
 
ddbc9ac
 
 
128003a
 
 
ddbc9ac
91bbd67
128003a
bf6a2a7
ac9050d
 
10ee58a
ddbc9ac
128003a
 
 
bf6a2a7
128003a
 
bf6a2a7
 
 
 
 
 
 
 
ac9050d
 
bf6a2a7
 
128003a
ddbc9ac
 
128003a
ddbc9ac
 
91bbd67
820afe6
 
f37ec25
bf6a2a7
 
 
 
 
 
 
 
3110228
820afe6
 
 
 
 
 
 
 
 
 
 
 
ddbc9ac
820afe6
ddbc9ac
b85b6b9
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import gradio as gr
import os
import threading
from urllib.parse import urlparse, parse_qs
import discord
from discord.ext import commands
import secrets
import asyncio

# Discord bot -----------------------------------------------------------------------------------------------
intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents)
GRADIO_APP_URL = "https://huggingface.co/spaces/lunarflu/gradio-oauth2"
DISCORD_TOKEN = os.environ.get("DISCORD_TOKEN", None)

# Dictionary to store user IDs and their corresponding unique strings
user_tokens = {}

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user}')

def generate_unique_string(length=6):
    return secrets.token_hex(length // 2)

@bot.command()
async def sendlink(ctx, user: discord.User):
    if ctx.author.id == 811235357663297546:
        unique_string = generate_unique_string()
        user_tokens[user.id] = unique_string
        unique_link = f"{GRADIO_APP_URL}?user_id={user.id}&token={unique_string}"
        await user.send(f"Click the link to sign in with Hugging Face: {unique_link}")

# Gradio ------------------------------------------------------------------------------------------------------------
def validate_link(request: gr.Request) -> bool:
    referer = request.headers.get('Referer', '')
    url_str = str(referer)
    query_params = parse_qs(urlparse(url_str).query)
    user_id = query_params.get('user_id', [None])[0]
    token = query_params.get('token', [None])[0]

    if user_id is None or token is None:
        return False

    if int(user_id) not in user_tokens or user_tokens[int(user_id)] != token:
        return False

    return True

def hello(profile: gr.OAuthProfile | None, request: gr.Request) -> str:
    if not validate_link(request):
        return "❌ Invalid link. Please use the link provided by the bot."

    referer = request.headers.get('Referer', '')
    url_str = str(referer)
    query_params = parse_qs(urlparse(url_str).query)
    user_id = query_params.get('user_id', [None])[0]

    if profile is None:
        return f"❌ Not logged in. User ID: {user_id}"

    return f"✅ Successfully logged in as {profile.username}. User ID: {user_id}"

with gr.Blocks() as demo:
    gr.Markdown("# Gradio OAuth Space")
    login_button = gr.LoginButton()
    m1 = gr.Markdown()

    def check_link_and_load():
        if validate_link(gr.Request()):
            demo.load(hello, inputs=None, outputs=m1)
        else:
            m1.update("❌ Invalid link. Please use the link provided by the bot.")

    check_link_and_load()

    def check_login_status():
        try:
            return login_button.get_session().get("oauth_info", None)
        except AttributeError:
            return None

    def check_login_wrapper():
        session = check_login_status()
        if session is None:
            return "Not logged in."
        else:
            return f"Logged in as {session.get('username', 'Unknown')}"

    login_button.click(check_login_wrapper, inputs=None, outputs=m1)

def run_gradio():
    demo.launch()

# Run the Gradio app in a separate thread
gradio_thread = threading.Thread(target=run_gradio)
gradio_thread.start()

# Run the Discord bot on the main thread
if DISCORD_TOKEN:
    bot.run(DISCORD_TOKEN)
else:
    print("Discord token not found. Please set the DISCORD_TOKEN environment variable.")