diff --git a/client/app/app.tsx b/client/app/app.tsx index 894f458..ff5c4c5 100644 --- a/client/app/app.tsx +++ b/client/app/app.tsx @@ -9,6 +9,8 @@ import { NotFound } from './pages/NotFound/NotFound'; import { Downloader } from './pages/Downloader/Downloader'; import { Pubg } from './pages/Pubg/Pubg'; import { Clips } from './pages/Clips'; +import { Oauth } from './pages/oauth/oauth'; +import 'babel-polyfill'; ReactDOM.render( @@ -18,6 +20,7 @@ ReactDOM.render( + diff --git a/client/app/components/Navbar/Navbar.tsx b/client/app/components/Navbar/Navbar.tsx index 615aa2c..de62a10 100644 --- a/client/app/components/Navbar/Navbar.tsx +++ b/client/app/components/Navbar/Navbar.tsx @@ -3,6 +3,10 @@ import { Link } from 'react-router'; import './Navbar.scss'; +// TODO: change url for build +const redirectUri = 'https://localhost/oauth'; +const oauthUrl = `https://discordapp.com/api/oauth2/authorize?client_id=410818759746650140&redirect_uri=${redirectUri}&response_type=code&scope=email`; + interface Props { } @@ -22,6 +26,7 @@ export class Navbar extends React.Component { Youtube Downloader Pubg Clips + Login ); } diff --git a/client/app/pages/oauth/oauth.tsx b/client/app/pages/oauth/oauth.tsx new file mode 100644 index 0000000..0b9ef42 --- /dev/null +++ b/client/app/pages/oauth/oauth.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { get } from 'lodash'; +import axios from 'axios'; + +interface Props { + +} + +interface State { + +} + +export class Oauth extends React.Component { + + constructor(props: Props) { + super(props); + } + + componentDidMount() { + const code = get(this, 'props.location.query.code'); + + if (code) { + // do stuff here + this.fetchOauth(code as string); + } + } + + private async fetchOauth(code: string) { + const res = await axios.post('/api/oauth', { code }); + console.log(res); + } + + render() { + return
+ } +} diff --git a/client/package.json b/client/package.json index 7e2fdab..49f8fd3 100644 --- a/client/package.json +++ b/client/package.json @@ -9,7 +9,7 @@ }, "author": "Mitchell Gerber", "license": "MIT", - "devDependencies": { + "dependencies": { "@types/lodash": "^4.14.71", "@types/react": "^16.0.0", "@types/react-dom": "^15.5.1", @@ -20,6 +20,7 @@ "babel-core": "^6.21.0", "babel-loader": "^6.2.10", "babel-plugin-add-module-exports": "^0.2.1", + "babel-polyfill": "^6.26.0", "babel-preset-es2015": "^6.18.0", "babel-preset-react": "^6.16.0", "babel-preset-stage-0": "^6.16.0", diff --git a/client/yarn.lock b/client/yarn.lock index 6b53943..ab221ef 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -812,6 +812,14 @@ babel-plugin-transform-strict-mode@^6.22.0: babel-runtime "^6.22.0" babel-types "^6.22.0" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + babel-preset-es2015@^6.18.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz#af5a98ecb35eb8af764ad8a5a05eb36dc4386835" @@ -907,6 +915,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + babel-template@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb" @@ -1406,6 +1421,10 @@ core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4034,6 +4053,14 @@ regenerator-runtime@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + regenerator-transform@0.9.8: version "0.9.8" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" diff --git a/config.template.json b/config.template.json index 2690072..6b1b01f 100644 --- a/config.template.json +++ b/config.template.json @@ -1,13 +1,16 @@ { - "Token": "", - "BotPrefix": "#", - "SoundsPath": "./sounds/", - "ClipsPath": "./clips/", - "UploadPassword": "", - "ServerAddr": ":80", + "token": "", + "client_id": "", + "client_secret": "", + "redirect_uri": "", + "bot_prefix": "#", + "sounds_path": "./sounds/", + "clips_path": "./clips/", + "upload_password": "", + "server_addr": "0.0.0.0:80", "pubg": { - "apiKey": "", - "enabled": true, + "api_key": "", + "enabled": false, "players": ["player1"] } } diff --git a/main.go b/main.go index f5f43f9..23aca4e 100644 --- a/main.go +++ b/main.go @@ -10,24 +10,18 @@ import ( ) func init() { + log.SetLevel(log.DebugLevel) + log.SetFormatter(&log.JSONFormatter{}) + log.SetOutput(os.Stdout) + //read config file config.Init() - // Log as JSON instead of the default ASCII formatter. - log.SetFormatter(&log.JSONFormatter{}) - - // Output to stdout instead of the default stderr - // Can be any io.Writer, see below for File example - log.SetOutput(os.Stdout) - if config.Flags.Prod { // prod gin.SetMode(gin.ReleaseMode) // Only log the warning severity or above. log.SetLevel(log.WarnLevel) - } else { - // debug - log.SetLevel(log.DebugLevel) } } diff --git a/server/config/config.go b/server/config/config.go index c1d70db..03335b1 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -3,8 +3,9 @@ package config import ( "encoding/json" "flag" - log "github.com/sirupsen/logrus" "io/ioutil" + + log "github.com/sirupsen/logrus" ) // Variables used for command line parameters @@ -14,15 +15,18 @@ var ( ) type configFile struct { - Token string `json:"Token"` - BotPrefix string `json:"BotPrefix"` //prefix to use for bot commands - SoundsPath string `json:"SoundsPath"` - ClipsPath string `json:"ClipsPath"` - UploadPassword string `json:"UploadPassword"` - ServerAddr string `json:"ServerAddr` + Token string `json:"token"` + ClientId string `json:"client_id"` + ClientSecret string `json:"client_secret"` + RedirectUri string `json:"redirect_uri"` + BotPrefix string `json:"bot_prefix"` //prefix to use for bot commands + SoundsPath string `json:"sounds_path"` + ClipsPath string `json:"clips_path"` + UploadPassword string `json:"upload_password"` + ServerAddr string `json:"server_addr"` Pubg struct { Enabled bool `json:"enabled"` - APIKey string `json:"apiKey"` + APIKey string `json:"api_key"` Players []string `json:"players"` } `json:"pubg"` } diff --git a/server/webserver/handlers/oauth.go b/server/webserver/handlers/oauth.go new file mode 100644 index 0000000..b77b61d --- /dev/null +++ b/server/webserver/handlers/oauth.go @@ -0,0 +1,94 @@ +package handlers + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + "strings" + + "github.com/gin-gonic/gin" + "github.com/mgerb/go-discord-bot/server/config" + log "github.com/sirupsen/logrus" +) + +const discordApi = "https://discordapp.com/api/v6/oauth2/token" + +type oauthReq struct { + Code string `json:"code"` +} + +type oauthResp struct { + AccessToken string `json:"access_token"` + TokenType string `json:"token_type"` + ExpiresIn int `json:"expires_in"` + RefreshToken string `json:"refresh_token"` + Scope string `json:"scope"` +} + +func Oauth(c *gin.Context) { + + var json oauthReq + + err := c.ShouldBindJSON(&json) + + if err != nil { + log.Error(err) + c.JSON(500, err) + return + } + + oauth, err := postReq(json.Code) + + if err != nil { + log.Error(err) + c.JSON(500, err) + return + } + + c.JSON(200, oauth) +} + +func postReq(code string) (oauthResp, error) { + + form := url.Values{} + + form.Set("client_id", config.Config.ClientId) + form.Set("client_secret", config.Config.ClientSecret) + form.Set("grant_type", "authorization_code") + form.Set("code", code) + form.Set("redirect_uri", config.Config.RedirectUri) + + req, err := http.NewRequest("POST", discordApi, strings.NewReader(form.Encode())) + + if err != nil { + return oauthResp{}, err + } + + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + c := &http.Client{} + resp, err := c.Do(req) + + if err != nil { + return oauthResp{}, err + } + + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + + if err != nil { + return oauthResp{}, err + } + + var oauth oauthResp + + err = json.Unmarshal(data, &oauth) + + if err != nil { + return oauthResp{}, err + } + + return oauth, nil +} diff --git a/server/webserver/server.go b/server/webserver/server.go index 90c5d6d..cc3bbff 100644 --- a/server/webserver/server.go +++ b/server/webserver/server.go @@ -25,6 +25,7 @@ func getRouter() *gin.Engine { api.GET("/soundlist", handlers.SoundList) api.GET("/cliplist", handlers.ClipList) api.POST("/upload", handlers.FileUpload) + api.POST("/oauth", handlers.Oauth) return router }