File size: 3,192 Bytes
ccec886
ddbc9ac
9034804
ddbc9ac
 
 
128003a
afc2013
128003a
ddbc9ac
 
a04ed72
ddbc9ac
 
0d88cd0
128003a
 
 
ddbc9ac
 
 
 
128003a
 
 
ddbc9ac
 
 
128003a
 
 
ddbc9ac
91bbd67
5166981
 
 
 
 
128003a
0906224
5166981
10ee58a
ddbc9ac
128003a
0d88cd0
128003a
0d88cd0
128003a
0d88cd0
 
 
 
 
128003a
ddbc9ac
0d88cd0
 
 
 
128003a
0d88cd0
ddbc9ac
91bbd67
be8f1c0
cfa119b
c162517
1607f2a
 
be8f1c0
 
 
3110228
cfa119b
 
 
 
820afe6
 
 
 
 
 
 
 
 
cfa119b
820afe6
cfa119b
ddbc9ac
cfa119b
ddbc9ac
0906224
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
import gradio as gr
import os
import threading
from urllib.parse import urlparse, parse_qs
import discord
from discord.ext import commands
import secrets

# 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}")

def run_bot():
    bot.run(DISCORD_TOKEN)

threading.Thread(target=run_bot).start()

# Gradio ------------------------------------------------------------------------------------------------------------
def hello(profile: gr.OAuthProfile | None, request: gr.Request) -> str:
    url_str = str(request.url)
    query_params = parse_qs(urlparse(url_str).query)
    user_id = query_params.get('user_id', [None])[0]
    token = query_params.get('token', [None])[0]
    user = await bot.fetch_user(user_id)

    print(f"token:{token}\n user_id:{user_id}\n profile:{profile}\n user_tokens:{user_tokens}")

    if token is None:
        return "# ❌ Invalid link, unique code is missing. Generate a new link [here](https://discord.com/channels/879548962464493619/900125909984624713) !."

    if user_id is None:
        return "# ❌ Invalid link, discord user_id is missing. Generate a new link [here](https://discord.com/channels/879548962464493619/900125909984624713) !."

    if profile is None:
        return f"# ❌ Log in with Hugging Face to verify!"
    
    if int(user_id) not in user_tokens or user_tokens[int(user_id)] != token:
        return "# ❌ Invalid or expired link. Generate a new link [here](https://discord.com/channels/879548962464493619/900125909984624713) ! "

    return f"# ✅ Successfully logged in as {profile.username}. Discord username: {user.name}"

with gr.Blocks() as demo:
    with gr.Row():
        gr.Markdown("# Discord Verification Space")
    with gr.Row():
        login_button = gr.LoginButton()

            
    m1 = gr.Markdown()
    demo.load(hello, inputs=None, outputs=m1)




    
    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)

demo.launch()