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
}