Spaces:
Running
Running
File size: 3,411 Bytes
ccec886 ddbc9ac 3abdf8c ddbc9ac 128003a afc2013 128003a ddbc9ac a04ed72 ddbc9ac 128003a ddbc9ac 128003a ddbc9ac 128003a ddbc9ac 91bbd67 3abdf8c 5166981 128003a a8afbac 5166981 10ee58a ddbc9ac 128003a 0d88cd0 128003a 0d88cd0 128003a 0d88cd0 128003a ddbc9ac 0d88cd0 128003a 0d88cd0 ddbc9ac 3abdf8c |
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 |
import gradio as gr
import os
import asyncio
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}")
async def run_bot():
await bot.start(DISCORD_TOKEN)
# Gradio ------------------------------------------------------------------------------------------------------------
async 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}"
def launch_gradio():
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()
async def main():
await asyncio.gather(
run_bot(),
asyncio.to_thread(launch_gradio)
)
if __name__ == "__main__":
asyncio.run(main())
|