import os import requests from django.contrib.auth import authenticate, login as django_login, logout as django_logout from django.contrib.auth.decorators import login_required from django.forms import modelformset_factory from django.shortcuts import render, redirect from django.urls import reverse from .forms import BaseForm, WusstestDuSchonConfigForm from .models import WusstestDuSchon # Create your views here. def home(request): return render(request, "home.html", {'title': 'HaugeBot'}) @login_required(login_url="/login") def wusstest_du_schon(request): WusstestDuSchonFormSet = modelformset_factory(WusstestDuSchon, form=BaseForm, fields=('advertised_command', 'text', 'use_prefix', 'active'), field_classes=['']) active = "config" form = None if request.method == "POST": active = request.POST["form-active"] if active == "config": form = WusstestDuSchonConfigForm(request.POST) elif active == "wusstestdu": form = WusstestDuSchonFormSet(request.POST, request.FILES) if form and form.is_valid(): form.save() forms = {"Konfiguration": { "display": "card", 'type': 'form', 'name': 'config', 'form': WusstestDuSchonConfigForm()}, "Texte": { 'display': 'card', 'type': 'formset', 'name': 'wusstestdu', 'formset': WusstestDuSchonFormSet(), 'remove_url': 'wusstest_du_schon_remove', }, } return render(request, "form.html", {'title': 'Wusstest du Schon?', 'forms': forms, 'active': active}) @login_required(login_url="/login") def wusstest_du_schon_remove(request, id): WusstestDuSchon.objects.filter(pk=id).delete() return redirect("/wusstest_du_schon") @login_required(login_url="/login") def wordcloud(request): id = os.getenv("DJANGO_WORDCLOUD_LIVE_ID") embed_link = f"{request.scheme}://{request.headers['Host']}{reverse('wordcloud_live', args=(id,))}" if request.user.is_broadcaster else "" return render(request, "wordcloud.html", {'title': 'Wordcloud', "ws_url": os.getenv("WORDCLOUD_WS_URL"), "session_key": request.session.session_key, "embed_link": embed_link}) def wordcloud_live(request, id): if id == os.getenv("DJANGO_WORDCLOUD_LIVE_ID"): return render(request, "live-wordcloud.html", {"ws_url": os.getenv("WORDCLOUD_WS_URL")}) def login(request): client_id = os.getenv("CLIENT_ID") redirect_uri = os.getenv("REDIRECT_URI") url = f"https://id.twitch.tv/oauth2/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code&scope=moderation:read" return redirect(url) def logout(request): django_logout(request) return redirect("/") def login_redirect(request): code = request.GET.get('code') user = exchange_code(code) if user: twitch_user = authenticate(request, user=user) twitch_user = list(twitch_user).pop() django_login(request, twitch_user) return redirect("/") def exchange_code(code): client_id = os.getenv("CLIENT_ID") client_secret = os.getenv("CLIENT_SECRET") redirect_uri = os.getenv("REDIRECT_URI") url = f"https://id.twitch.tv/oauth2/token?client_id={client_id}&client_secret={client_secret}&code={code}&grant_type=authorization_code&redirect_uri={redirect_uri}" response = requests.post(url) if response.status_code == 200: credentials = response.json() response = requests.get("https://api.twitch.tv/helix/users", headers={ 'Authorization': f'Bearer {credentials["access_token"]}', 'Client-Id': client_id }) user = response.json()["data"][0] return {'id': user['id'], 'login': user['login'], 'access_token': credentials['access_token'], 'refresh_token': credentials['refresh_token']} return None