mirror of
https://github.com/mgerb/go-discord-bot
synced 2026-01-10 09:02:49 +00:00
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,3 +7,4 @@ bot
|
|||||||
sounds
|
sounds
|
||||||
debug
|
debug
|
||||||
youtube
|
youtube
|
||||||
|
go-discord-bot
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"commonjs": true,
|
|
||||||
"es6": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"installedESLint": true,
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"experimentalObjectRestSpread": true,
|
|
||||||
"jsx": true
|
|
||||||
},
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"plugins": [
|
|
||||||
"react"
|
|
||||||
],
|
|
||||||
"rules": {
|
|
||||||
"indent": [
|
|
||||||
"error",
|
|
||||||
4
|
|
||||||
],
|
|
||||||
"semi": [
|
|
||||||
"error",
|
|
||||||
"always"
|
|
||||||
],
|
|
||||||
|
|
||||||
"react/display-name": 0, // Prevent missing displayName in a React component definition
|
|
||||||
"react/jsx-no-undef": 2, // Disallow undeclared variables in JSX
|
|
||||||
"react/jsx-sort-props": 0, // Enforce props alphabetical sorting
|
|
||||||
"react/jsx-uses-react": 2, // Prevent React to be incorrectly marked as unused
|
|
||||||
"react/jsx-uses-vars": 2, // Prevent variables used in JSX to be incorrectly marked as unused
|
|
||||||
"react/no-did-mount-set-state": 2, // Prevent usage of setState in componentDidMount
|
|
||||||
"react/no-did-update-set-state": 2, // Prevent usage of setState in componentDidUpdate
|
|
||||||
"react/no-multi-comp": 0, // Prevent multiple component definition per file
|
|
||||||
"react/no-unknown-property": 2, // Prevent usage of unknown DOM property
|
|
||||||
"react/prop-types": 2, // Prevent missing props validation in a React component definition
|
|
||||||
"react/react-in-jsx-scope": 2, // Prevent missing React when using JSX
|
|
||||||
"react/self-closing-comp": 2, // Prevent extra closing tags for components without children
|
|
||||||
"react/wrap-multilines": 2 // Prevent missing parentheses around multilines JSX
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"indent_size": 4,
|
|
||||||
"beautify.language": {
|
|
||||||
"js": {
|
|
||||||
"type": ["javascript", "json", "jsx"],
|
|
||||||
"filename": [".jshintrc", ".jsbeautify"],
|
|
||||||
"e4x": true
|
|
||||||
// "ext": ["js", "json"]
|
|
||||||
// ^^ to set extensions to be beautified using the javascript beautifier
|
|
||||||
},
|
|
||||||
"css": ["css", "scss"],
|
|
||||||
"html": ["htm", "html"]
|
|
||||||
// ^^ providing just an array sets the VS Code file type
|
|
||||||
}
|
|
||||||
}
|
|
||||||
32
client/app/pages/Pubg/Pubg.scss
Normal file
32
client/app/pages/Pubg/Pubg.scss
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
@import "../../scss/variables";
|
||||||
|
|
||||||
|
.pubg__container {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pubg__table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
tr + tr {
|
||||||
|
border-top: 1px solid $gray3;
|
||||||
|
}
|
||||||
|
|
||||||
|
td, th {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.pubg__button-row {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
.button {
|
||||||
|
min-width: 100px;
|
||||||
|
|
||||||
|
& + .button {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,145 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import axios from 'axios';
|
||||||
|
import * as _ from 'lodash';
|
||||||
|
import './Pubg.scss';
|
||||||
|
|
||||||
export class Pubg extends React.Component<any, any> {
|
interface Props {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
players: Player[];
|
||||||
|
selectedRegion: string;
|
||||||
|
selectedMatch: string;
|
||||||
|
statList: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Player {
|
||||||
|
PlayerName: string;
|
||||||
|
agg?: any;
|
||||||
|
as?: any;
|
||||||
|
na?: any;
|
||||||
|
sa?: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Pubg extends React.Component<Props, State> {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.state = {
|
||||||
|
players: [],
|
||||||
|
selectedRegion: 'agg',
|
||||||
|
selectedMatch: 'squad',
|
||||||
|
statList: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
axios.get("/stats/pubg").then((res) => {
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
players: _.map(res.data) as any,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.setStatList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get stat list
|
||||||
|
setStatList() {
|
||||||
|
|
||||||
|
// hacky way to find existing content -- to tired to make it pretty
|
||||||
|
let i = 0;
|
||||||
|
let stats;
|
||||||
|
while (!stats) {
|
||||||
|
if (i > this.state.players.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stats = _.find(_.get(this.state, `players[${i}].Stats`), (s: any) => s.Match === this.state.selectedMatch.toLowerCase());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stats) {
|
||||||
|
this.setState({
|
||||||
|
statList: _.sortBy(_.map(stats.Stats, 'field')) as any,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
insertRows(): any {
|
||||||
|
return this.state.statList.map((val: any, index: any) => {
|
||||||
|
return (
|
||||||
|
<tr key={index}>
|
||||||
|
<td>{val}</td>
|
||||||
|
{this.state.players.map((player: any, i: number) => {
|
||||||
|
// find player stats for field
|
||||||
|
let playerStat = _.find(player.Stats, (p: any) => {
|
||||||
|
return p.Match === this.state.selectedMatch.toLowerCase() && p.Region === this.state.selectedRegion.toLowerCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
return <td key={i}>{_.get(_.find(_.get(playerStat, 'Stats'), (p: any) => p.field === val), 'displayValue')}</td>
|
||||||
|
})}
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
buttonRegion(title: string) {
|
||||||
|
let lowerTitle = title === 'All' ? 'agg' : title.toLowerCase()
|
||||||
|
return (
|
||||||
|
<button className={`button ${lowerTitle === this.state.selectedRegion ? 'button--primary' : ''}`}
|
||||||
|
onClick={() => {
|
||||||
|
this.setState({selectedRegion: lowerTitle});
|
||||||
|
this.setStatList();
|
||||||
|
}}>{title}</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
buttonMatch(title: string) {
|
||||||
|
let lowerTitle = title.toLowerCase()
|
||||||
|
return (
|
||||||
|
<button className={`button ${lowerTitle === this.state.selectedMatch ? 'button--primary' : ''}`}
|
||||||
|
onClick={() => {
|
||||||
|
this.setState({selectedMatch: lowerTitle});
|
||||||
|
this.setStatList();
|
||||||
|
}}>{title}</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>test 123</div>
|
<div className="pubg__container">
|
||||||
|
<div className="card" style={{maxWidth:'initial'}}>
|
||||||
|
<div className="card__header">PUBG Stats</div>
|
||||||
|
|
||||||
|
<div className="pubg__button-row">
|
||||||
|
{this.buttonMatch('Solo')}
|
||||||
|
{this.buttonMatch('Duo')}
|
||||||
|
{this.buttonMatch('Squad')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="pubg__button-row">
|
||||||
|
{this.buttonRegion('All')}
|
||||||
|
{this.buttonRegion('Na')}
|
||||||
|
{this.buttonRegion('As')}
|
||||||
|
{this.buttonRegion('Au')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table className="pubg__table">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
{this.state.players.map((val: any, index: number) => {
|
||||||
|
return <th key={index}>{val.PlayerName}</th>;
|
||||||
|
})}
|
||||||
|
</tr>
|
||||||
|
{this.insertRows()}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"author": "Mitchell Gerber",
|
"author": "Mitchell Gerber",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/lodash": "^4.14.71",
|
||||||
"@types/react": "^16.0.0",
|
"@types/react": "^16.0.0",
|
||||||
"@types/react-dom": "^15.5.1",
|
"@types/react-dom": "^15.5.1",
|
||||||
"@types/react-dropzone": "^3.13.1",
|
"@types/react-dropzone": "^3.13.1",
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
"extract-text-webpack-plugin": "2.0.0-rc.1",
|
"extract-text-webpack-plugin": "2.0.0-rc.1",
|
||||||
"file-loader": "^0.10.0",
|
"file-loader": "^0.10.0",
|
||||||
"html-webpack-plugin": "^2.24.1",
|
"html-webpack-plugin": "^2.24.1",
|
||||||
|
"lodash": "^4.17.4",
|
||||||
"node-sass": "^4.5.3",
|
"node-sass": "^4.5.3",
|
||||||
"postcss-loader": "^1.2.1",
|
"postcss-loader": "^1.2.1",
|
||||||
"react": "15.6.1",
|
"react": "15.6.1",
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
version "3.2.1"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/history/-/history-3.2.1.tgz#0039ab0e0be2a0cc22bac171d27a44588103d123"
|
resolved "https://registry.yarnpkg.com/@types/history/-/history-3.2.1.tgz#0039ab0e0be2a0cc22bac171d27a44588103d123"
|
||||||
|
|
||||||
|
"@types/lodash@^4.14.71":
|
||||||
|
version "4.14.71"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.71.tgz#0dc383f78981216ac76e2f2c3afd998e0450e4c1"
|
||||||
|
|
||||||
"@types/react-dom@^15.5.1":
|
"@types/react-dom@^15.5.1":
|
||||||
version "15.5.1"
|
version "15.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-15.5.1.tgz#f3c3e14c682785923c7d64583537df319442dec1"
|
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-15.5.1.tgz#f3c3e14c682785923c7d64583537df319442dec1"
|
||||||
@@ -2955,7 +2959,7 @@ lodash.uniq@^4.3.0:
|
|||||||
version "4.5.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
||||||
|
|
||||||
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.2.0, lodash@^4.3.0:
|
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0:
|
||||||
version "4.17.4"
|
version "4.17.4"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,10 @@
|
|||||||
"BotPrefix": "#",
|
"BotPrefix": "#",
|
||||||
"SoundsPath": "./sounds/",
|
"SoundsPath": "./sounds/",
|
||||||
"UploadPassword": "",
|
"UploadPassword": "",
|
||||||
"ServerAddr": ":80"
|
"ServerAddr": ":80",
|
||||||
|
"pubg": {
|
||||||
|
"apiKey": "",
|
||||||
|
"enabled": true,
|
||||||
|
"players": ["player1"]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6
main.go
6
main.go
@@ -16,11 +16,9 @@ func main() {
|
|||||||
|
|
||||||
//add handlers
|
//add handlers
|
||||||
bot.AddHandler(bothandlers.SoundsHandler)
|
bot.AddHandler(bothandlers.SoundsHandler)
|
||||||
// remove gif functionality for not
|
|
||||||
//bot.AddHandler(bothandlers.GifHandler)
|
|
||||||
|
|
||||||
// start new go routine for the discord websockets
|
// start the bot
|
||||||
go bot.Start()
|
bot.Start()
|
||||||
|
|
||||||
// start the web server
|
// start the web server
|
||||||
webserver.Start()
|
webserver.Start()
|
||||||
|
|||||||
@@ -39,18 +39,22 @@ func Connect(token string) {
|
|||||||
|
|
||||||
// Start - blocking function that starts a websocket listenting for discord callbacks
|
// Start - blocking function that starts a websocket listenting for discord callbacks
|
||||||
func Start() {
|
func Start() {
|
||||||
// Open the websocket and begin listening.
|
|
||||||
err := Session.Open()
|
// start new non blocking go routine
|
||||||
if err != nil {
|
go func() {
|
||||||
fmt.Println("error opening connection,", err)
|
// Open the websocket and begin listening.
|
||||||
|
err := Session.Open()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error opening connection,", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Bot is now running...")
|
||||||
|
|
||||||
|
// Simple way to keep program running until CTRL-C is pressed.
|
||||||
|
<-make(chan struct{})
|
||||||
return
|
return
|
||||||
}
|
}()
|
||||||
|
|
||||||
fmt.Println("Bot is now running...")
|
|
||||||
|
|
||||||
// Simple way to keep program running until CTRL-C is pressed.
|
|
||||||
<-make(chan struct{})
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddHandler(handler interface{}) {
|
func AddHandler(handler interface{}) {
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ type configFile struct {
|
|||||||
SoundsPath string `json:"SoundsPath"`
|
SoundsPath string `json:"SoundsPath"`
|
||||||
UploadPassword string `json:"UploadPassword"`
|
UploadPassword string `json:"UploadPassword"`
|
||||||
ServerAddr string `json:"ServerAddr`
|
ServerAddr string `json:"ServerAddr`
|
||||||
|
Pubg struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
APIKey string `json:"apiKey"`
|
||||||
|
Players []string `json:"players"`
|
||||||
|
} `json:"pubg"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type configFlags struct {
|
type configFlags struct {
|
||||||
|
|||||||
54
server/webserver/pubg/pubg.go
Normal file
54
server/webserver/pubg/pubg.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package pubg
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/mgerb/chi_auth_server/response"
|
||||||
|
pubgClient "github.com/mgerb/go-pubg"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
apiKey string
|
||||||
|
stats = map[string]*pubgClient.Player{}
|
||||||
|
mut = &sync.Mutex{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Start -
|
||||||
|
func Start(key string, players []string) {
|
||||||
|
|
||||||
|
apiKey = key
|
||||||
|
|
||||||
|
log.Println("Gathering pubg data...")
|
||||||
|
|
||||||
|
go fetchStats(players)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchStats(players []string) {
|
||||||
|
|
||||||
|
api := pubgClient.New(apiKey)
|
||||||
|
|
||||||
|
// fetch new stats every 30 seconds
|
||||||
|
for {
|
||||||
|
|
||||||
|
for _, player := range players {
|
||||||
|
newStats := api.GetPlayer(player)
|
||||||
|
|
||||||
|
mut.Lock()
|
||||||
|
stats[player] = newStats
|
||||||
|
mut.Unlock()
|
||||||
|
|
||||||
|
time.Sleep(time.Second * 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(time.Second * 30)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler - returns the pubg stats
|
||||||
|
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
response.JSON(w, stats)
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/go-chi/chi/middleware"
|
"github.com/go-chi/chi/middleware"
|
||||||
"github.com/mgerb/go-discord-bot/server/config"
|
"github.com/mgerb/go-discord-bot/server/config"
|
||||||
"github.com/mgerb/go-discord-bot/server/webserver/handlers"
|
"github.com/mgerb/go-discord-bot/server/webserver/handlers"
|
||||||
|
"github.com/mgerb/go-discord-bot/server/webserver/pubg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getRouter() *chi.Mux {
|
func getRouter() *chi.Mux {
|
||||||
@@ -40,12 +41,19 @@ func getRouter() *chi.Mux {
|
|||||||
r.Get("/soundlist", handlers.SoundList)
|
r.Get("/soundlist", handlers.SoundList)
|
||||||
r.Put("/upload", handlers.FileUpload)
|
r.Put("/upload", handlers.FileUpload)
|
||||||
r.Get("/ytdownloader", handlers.Downloader)
|
r.Get("/ytdownloader", handlers.Downloader)
|
||||||
|
r.Get("/stats/pubg", pubg.Handler)
|
||||||
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start -
|
// Start -
|
||||||
func Start() {
|
func Start() {
|
||||||
|
|
||||||
|
// start gathering pubg data from the api
|
||||||
|
if config.Config.Pubg.Enabled {
|
||||||
|
pubg.Start(config.Config.Pubg.APIKey, config.Config.Pubg.Players)
|
||||||
|
}
|
||||||
|
|
||||||
router := getRouter()
|
router := getRouter()
|
||||||
|
|
||||||
if config.Flags.TLS {
|
if config.Flags.TLS {
|
||||||
|
|||||||
Reference in New Issue
Block a user