1
0
mirror of https://github.com/mgerb/go-discord-bot synced 2026-01-10 09:02:49 +00:00

feat: add favorites - update dependencies

This commit is contained in:
2020-06-11 22:41:02 -05:00
parent b7d13ee5fd
commit 58170df201
18 changed files with 3040 additions and 2307 deletions

View File

@@ -1,11 +1,11 @@
FROM node:10.16-alpine FROM node:12.18-alpine3.12
WORKDIR /home/client WORKDIR /home/client
ADD ./client/ /home/client/ ADD ./client/ /home/client/
RUN npm install RUN npm install
RUN npm run build RUN npm run build
FROM golang:1.12.9-alpine3.10 FROM golang:1.14.4-alpine3.12
WORKDIR /go/src/github.com/mgerb/go-discord-bot/server WORKDIR /go/src/github.com/mgerb/go-discord-bot/server
COPY --from=0 /home/dist /go/src/github.com/mgerb/go-discord-bot/dist COPY --from=0 /home/dist /go/src/github.com/mgerb/go-discord-bot/dist
@@ -18,7 +18,7 @@ RUN packr build -o /build/bot
RUN go build -o /build/bot-scripts ./scripts RUN go build -o /build/bot-scripts ./scripts
FROM wernight/youtube-dl:latest FROM alpine:3.12
RUN apk update RUN apk update
RUN apk add ca-certificates opus-dev opusfile-dev RUN apk add ca-certificates opus-dev opusfile-dev

View File

@@ -1,19 +1,18 @@
import React from 'react'; import React from 'react';
import { SoundService } from '../../services'; import { SoundListType, SoundType } from '../../model';
interface IProps { interface IProps {
sound: SoundType; sound: SoundType;
type: 'sounds' | 'clips'; type: SoundListType;
showDiscordPlay?: boolean; hasModPermissions: boolean;
showFavorite?: boolean;
onFavorite?: () => void;
onPlayBrowser: (sound: SoundType) => void;
onPlayDiscord: (sound: SoundType) => void;
} }
interface IState {} interface IState {}
export interface SoundType {
extension: string;
name: string;
}
export class ClipPlayerControl extends React.Component<IProps, IState> { export class ClipPlayerControl extends React.Component<IProps, IState> {
checkExtension(extension: string) { checkExtension(extension: string) {
switch (extension) { switch (extension) {
@@ -28,22 +27,21 @@ export class ClipPlayerControl extends React.Component<IProps, IState> {
} }
} }
handlePlayAudioInBrowser(sound: SoundType, type: string) {
const url = `/public/${type.toLowerCase()}/` + sound.name + '.' + sound.extension;
const audio = new Audio(url);
audio.play();
}
onPlayDiscord = (sound: SoundType) => {
SoundService.playSound(sound);
};
render() { render() {
const { sound, showDiscordPlay, type } = this.props; const { onPlayBrowser, onPlayDiscord, sound, hasModPermissions, showFavorite, type } = this.props;
return ( return (
this.checkExtension(sound.extension) && ( this.checkExtension(sound.extension) && (
<div className="flex flex--center"> <div className="flex flex--center">
{showFavorite && hasModPermissions && (
<i
title="Favorite"
className={'fa link fa-lg ' + (type === 'favorites' ? 'fa-trash' : 'fa-heart color__red')}
aria-hidden="true"
style={{ paddingRight: '5px' }}
onClick={() => !this.props.onFavorite || this.props.onFavorite()}
/>
)}
<a <a
href={`/public/${type.toLowerCase()}/` + sound.name + '.' + sound.extension} href={`/public/${type.toLowerCase()}/` + sound.name + '.' + sound.extension}
download download
@@ -56,15 +54,15 @@ export class ClipPlayerControl extends React.Component<IProps, IState> {
className="fa fa-play link" className="fa fa-play link"
aria-hidden="true" aria-hidden="true"
style={{ paddingLeft: '15px' }} style={{ paddingLeft: '15px' }}
onClick={() => this.handlePlayAudioInBrowser(sound, type)} onClick={() => onPlayBrowser(sound)}
/> />
{showDiscordPlay && ( {hasModPermissions && (
<i <i
title="Play in discord" title="Play in discord"
className="fa fa-play-circle link fa-lg" className="fa fa-play-circle link fa-lg"
aria-hidden="true" aria-hidden="true"
style={{ paddingLeft: '10px' }} style={{ paddingLeft: '10px' }}
onClick={() => this.onPlayDiscord(sound)} onClick={() => onPlayDiscord(sound)}
/> />
)} )}
</div> </div>

View File

@@ -1,25 +1,23 @@
import React from 'react'; import React from 'react';
import { SoundListType, SoundType } from '../../model';
import { SoundService } from '../../services';
import { ClipPlayerControl } from '../clip-player-control/clip-player-control'; import { ClipPlayerControl } from '../clip-player-control/clip-player-control';
import './sound-list.scss'; import './sound-list.scss';
interface Props { interface Props {
soundList: SoundType[]; soundList: SoundType[];
type: 'sounds' | 'clips'; type: SoundListType;
title: string; title: string;
onPlayDiscord?: (sound: SoundType) => void; onPlayDiscord?: (sound: SoundType) => void;
showDiscordPlay?: boolean; hasModPermissions: boolean;
onFavorite?: (sound: SoundType) => void;
deleteFavorite?: (sound: SoundType) => void;
} }
interface State { interface State {
showAudioControls: boolean[]; showAudioControls: boolean[];
} }
export interface SoundType {
extension: string;
name: string;
prefix?: string;
}
export class SoundList extends React.Component<Props, State> { export class SoundList extends React.Component<Props, State> {
constructor(props: Props) { constructor(props: Props) {
super(props); super(props);
@@ -41,14 +39,8 @@ export class SoundList extends React.Component<Props, State> {
} }
} }
handlePlayAudioInBrowser(sound: SoundType, type: string) {
const url = `/public/${type.toLowerCase()}/` + sound.name + '.' + sound.extension;
const audio = new Audio(url);
audio.play();
}
render() { render() {
const { showDiscordPlay, soundList, title, type } = this.props; const { hasModPermissions, onFavorite, soundList, title, type } = this.props;
return ( return (
<div className="card"> <div className="card">
@@ -66,10 +58,18 @@ export class SoundList extends React.Component<Props, State> {
return ( return (
<div key={index} className="sound-list__item"> <div key={index} className="sound-list__item">
<div className="text-wrap"> <div className="text-wrap">
{(type === 'sounds' && sound.prefix ? sound.prefix : '') + sound.name} {((type === 'sounds' || type === 'favorites') && sound.prefix ? sound.prefix : '') + sound.name}
</div> </div>
<ClipPlayerControl showDiscordPlay={showDiscordPlay} sound={sound} type={type} /> <ClipPlayerControl
showFavorite={type !== 'clips'}
onFavorite={() => !onFavorite || onFavorite(sound)}
hasModPermissions={hasModPermissions}
sound={sound}
type={type}
onPlayBrowser={(sound) => SoundService.playAudioInBrowser(sound, type)}
onPlayDiscord={SoundService.playSound}
/>
</div> </div>
); );
}) })

View File

@@ -1,5 +1,14 @@
import { IUser } from './user'; import { IUser } from './user';
export type SoundListType = 'sounds' | 'clips' | 'favorites';
export interface SoundType {
extension: string;
name: string;
prefix?: string;
}
// sound from database
export interface ISound { export interface ISound {
created_at: string; created_at: string;
deleted_at?: string; deleted_at?: string;

View File

@@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import { SoundList, SoundType } from '../../components'; import { SoundList } from '../../components';
import { SoundType } from '../../model';
import { axios } from '../../services'; import { axios } from '../../services';
interface Props {} interface Props {}
@@ -23,7 +24,7 @@ export class Clips extends React.Component<Props, State> {
private getClipList() { private getClipList() {
axios axios
.get('/api/cliplist') .get('/api/cliplist')
.then(response => { .then((response) => {
this.setState({ this.setState({
clipList: response.data, clipList: response.data,
}); });
@@ -37,7 +38,8 @@ export class Clips extends React.Component<Props, State> {
return ( return (
<div className="content"> <div className="content">
<div className="column"> <div className="column">
<SoundList soundList={this.state.clipList} type="clips" title="Clips" /> {/* no need for permissions on this component - set false */}
<SoundList soundList={this.state.clipList} type="clips" title="Clips" hasModPermissions={false} />
</div> </div>
</div> </div>
); );

View File

@@ -13,7 +13,7 @@ export class Oauth extends React.Component<Props, State> {
} }
componentDidMount() { componentDidMount() {
const params = queryString.parse(this.props.location.search); const params: any = queryString.parse(this.props.location.search);
if (params['code']) { if (params['code']) {
// do stuff here // do stuff here

View File

@@ -1,6 +1,7 @@
import { inject, observer } from 'mobx-react'; import { inject, observer } from 'mobx-react';
import React from 'react'; import React from 'react';
import { SoundList, SoundType, Uploader } from '../../components'; import { SoundList, Uploader } from '../../components';
import { SoundType } from '../../model';
import { axios, SoundService } from '../../services'; import { axios, SoundService } from '../../services';
import { AppStore } from '../../stores'; import { AppStore } from '../../stores';
import './soundboard.scss'; import './soundboard.scss';
@@ -39,7 +40,7 @@ export class Soundboard extends React.Component<Props, State> {
if (!this.soundListCache) { if (!this.soundListCache) {
axios axios
.get('/api/soundlist') .get('/api/soundlist')
.then(response => { .then((response) => {
this.soundListCache = response.data; this.soundListCache = response.data;
this.setState({ this.setState({
soundList: response.data, soundList: response.data,
@@ -64,18 +65,42 @@ export class Soundboard extends React.Component<Props, State> {
SoundService.playSound(sound); SoundService.playSound(sound);
}; };
onFavorite = (sound: SoundType) => {
this.props.appStore?.addFavorite(sound);
};
onDeleteFavorite = (sound: SoundType) => {
this.props.appStore?.removeFavorite(sound);
};
render() { render() {
const { soundList } = this.state; const { soundList } = this.state;
const { appStore } = this.props;
if (!this.props.appStore) {
return null;
}
const { hasModPermissions, getFavorites } = this.props.appStore;
return ( return (
<div className="content"> <div className="content">
<Uploader onComplete={this.onUploadComplete} /> <Uploader onComplete={this.onUploadComplete} />
{((hasModPermissions && getFavorites().length) || 0 > 0) && (
<SoundList
soundList={getFavorites()}
title="Favorites"
type="favorites"
onPlayDiscord={this.onPlayDiscord}
hasModPermissions={hasModPermissions()}
onFavorite={this.onDeleteFavorite}
/>
)}
<SoundList <SoundList
soundList={soundList} soundList={soundList}
title="Sounds" title="Sounds"
type="sounds" type="sounds"
onPlayDiscord={this.onPlayDiscord} onPlayDiscord={this.onPlayDiscord}
showDiscordPlay={appStore!.hasModPermissions()} hasModPermissions={hasModPermissions()}
onFavorite={this.onFavorite}
/> />
</div> </div>
); );

View File

@@ -26,12 +26,12 @@ export class UploadHistory extends React.Component<IProps, IState> {
} }
componentDidMount() { componentDidMount() {
SoundService.getSounds().then(sounds => { SoundService.getSounds().then((sounds) => {
this.setState({ sounds }); this.setState({ sounds });
}); });
} }
renderUploadHistory = (sounds: ISound[], showDiscordPlay: boolean) => { renderUploadHistory = (sounds: ISound[], hasModPermissions: boolean) => {
const sortedSounds = orderBy(sounds, 'created_at', 'desc'); const sortedSounds = orderBy(sounds, 'created_at', 'desc');
return ( return (
<div className="card"> <div className="card">
@@ -63,7 +63,13 @@ export class UploadHistory extends React.Component<IProps, IState> {
{s.user.email} {s.user.email}
</td> </td>
<td> <td>
<ClipPlayerControl showDiscordPlay={showDiscordPlay} sound={s} type="sounds"></ClipPlayerControl> <ClipPlayerControl
onPlayBrowser={(sound) => SoundService.playAudioInBrowser(sound, 'sounds')}
onPlayDiscord={SoundService.playSound}
hasModPermissions={hasModPermissions}
sound={s}
type="sounds"
></ClipPlayerControl>
</td> </td>
</tr> </tr>
); );

View File

@@ -1,5 +1,4 @@
import { SoundType } from '../components/sound-list/sound-list'; import { ISound, SoundListType, SoundType } from '../model';
import { ISound } from '../model';
import { axios } from './axios.service'; import { axios } from './axios.service';
const playSound = (sound: SoundType): Promise<any> => { const playSound = (sound: SoundType): Promise<any> => {
@@ -11,7 +10,15 @@ const getSounds = async (): Promise<ISound[]> => {
return res.data.data; return res.data.data;
}; };
export const playAudioInBrowser = (sound: SoundType, type: SoundListType) => {
const t = type === 'favorites' ? 'sounds' : type;
const url = `/public/${t.toLowerCase()}/` + sound.name + '.' + sound.extension;
const audio = new Audio(url);
audio.play();
};
export const SoundService = { export const SoundService = {
getSounds, getSounds,
playSound, playSound,
playAudioInBrowser,
}; };

View File

@@ -1,3 +1,5 @@
import { SoundType } from '../model';
const clear = () => { const clear = () => {
localStorage.clear(); localStorage.clear();
}; };
@@ -10,8 +12,19 @@ const getJWT = (): string | null => {
return localStorage.getItem('jwt'); return localStorage.getItem('jwt');
}; };
const getFavorites = (): SoundType[] => {
const f = localStorage.getItem('favorites');
return f ? JSON.parse(f) : [];
};
const setFavorites = (f: SoundType[]): void => {
localStorage.setItem('favorites', JSON.stringify(f));
};
export const StorageService = { export const StorageService = {
clear, clear,
getJWT, getJWT,
setJWT, setJWT,
getFavorites,
setFavorites,
}; };

View File

@@ -1,6 +1,7 @@
import jwt_decode from 'jwt-decode'; import jwt_decode from 'jwt-decode';
import { filter, uniqBy } from 'lodash';
import { action, observable } from 'mobx'; import { action, observable } from 'mobx';
import { IClaims, Permissions } from '../model'; import { IClaims, Permissions, SoundType } from '../model';
import { axios, StorageService } from '../services'; import { axios, StorageService } from '../services';
import { Util } from '../util'; import { Util } from '../util';
@@ -11,9 +12,12 @@ export class AppStore {
public jwt?: string; public jwt?: string;
@observable @observable
public claims?: IClaims; public claims?: IClaims;
@observable
private favorites: SoundType[] = [];
constructor() { constructor() {
const jwt = StorageService.getJWT(); const jwt = StorageService.getJWT();
this.favorites = StorageService.getFavorites();
this.setJWT(jwt as string); this.setJWT(jwt as string);
this.initNavbar(); this.initNavbar();
} }
@@ -24,7 +28,7 @@ export class AppStore {
} }
} }
private setJWT(jwt?: string) { private setJWT = (jwt?: string) => {
if (!jwt) { if (!jwt) {
return; return;
} }
@@ -34,7 +38,21 @@ export class AppStore {
if (claims) { if (claims) {
this.claims = claims as IClaims; this.claims = claims as IClaims;
} }
} };
public getFavorites = (): SoundType[] => {
return this.favorites;
};
public addFavorite = (f: SoundType): void => {
this.favorites = uniqBy([...this.favorites, f], 'name');
StorageService.setFavorites(this.favorites);
};
public removeFavorite = (f: SoundType): void => {
this.favorites = filter(this.favorites, (fa) => fa.name !== f.name);
StorageService.setFavorites(this.favorites);
};
@action @action
public toggleNavbar = () => { public toggleNavbar = () => {

View File

@@ -7,7 +7,7 @@ import './wrapper.scss';
export const Wrapper = inject('appStore')( export const Wrapper = inject('appStore')(
withRouter( withRouter(
observer(({ appStore, children }) => { observer(({ appStore, children }: any) => {
const openClass = appStore.navbarOpen ? 'wrapper--open' : ''; const openClass = appStore.navbarOpen ? 'wrapper--open' : '';
const onNavClick = () => { const onNavClick = () => {
if (Util.isMobileScreen()) { if (Util.isMobileScreen()) {

4987
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,16 +10,16 @@
"author": "Mitchell Gerber", "author": "Mitchell Gerber",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/chart.js": "^2.7.22", "@types/chart.js": "^2.9.21",
"@types/jwt-decode": "^2.2.1", "@types/jwt-decode": "^2.2.1",
"@types/lodash": "^4.14.137", "@types/lodash": "^4.14.155",
"@types/luxon": "^1.2.2", "@types/luxon": "^1.24.0",
"@types/node": "^10.3.4", "@types/node": "^10.3.4",
"@types/nprogress": "0.0.29", "@types/nprogress": "0.0.29",
"@types/query-string": "^6.1.0", "@types/query-string": "^6.3.0",
"@types/react": "^16.4.1", "@types/react": "^16.9.36",
"@types/react-chartjs-2": "^2.5.7", "@types/react-chartjs-2": "^2.5.7",
"@types/react-dom": "^16.0.6", "@types/react-dom": "^16.9.8",
"@types/react-dropzone": "^4.2.0", "@types/react-dropzone": "^4.2.0",
"@types/react-router-dom": "^4.2.7", "@types/react-router-dom": "^4.2.7",
"autoprefixer": "^8.6.3", "autoprefixer": "^8.6.3",
@@ -31,7 +31,7 @@
"babel-preset-es2015": "^6.18.0", "babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0", "babel-preset-react": "^6.16.0",
"babel-preset-stage-0": "^6.16.0", "babel-preset-stage-0": "^6.16.0",
"chart.js": "^2.7.2", "chart.js": "^2.9.3",
"clean-webpack-plugin": "^0.1.14", "clean-webpack-plugin": "^0.1.14",
"css-loader": "^0.28.11", "css-loader": "^0.28.11",
"favicons-webpack-plugin": "0.0.9", "favicons-webpack-plugin": "0.0.9",
@@ -40,27 +40,27 @@
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"jwt-decode": "^2.2.0", "jwt-decode": "^2.2.0",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"luxon": "^1.3.3", "luxon": "^1.24.1",
"mini-css-extract-plugin": "^0.4.2", "mini-css-extract-plugin": "^0.4.2",
"mobx": "^5.0.3", "mobx": "^5.15.4",
"mobx-react": "^5.2.5", "mobx-react": "^5.2.5",
"node-sass": "^4.9.3", "node-sass": "^4.14.1",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"postcss-loader": "^2.1.5", "postcss-loader": "^2.1.5",
"query-string": "^6.1.0", "query-string": "^6.13.1",
"react": "^16.4.1", "react": "^16.13.1",
"react-chartjs-2": "^2.7.6", "react-chartjs-2": "^2.9.0",
"react-dom": "^16.4.1", "react-dom": "^16.13.1",
"react-dropzone": "^4.2.11", "react-dropzone": "^4.2.11",
"react-router-dom": "^4.3.1", "react-router-dom": "^4.3.1",
"sass-loader": "^7.0.3", "sass-loader": "^7.0.3",
"style-loader": "^0.21.0", "style-loader": "^0.21.0",
"ts-loader": "^4.4.1", "ts-loader": "^4.4.1",
"typescript": "^2.9.2", "typescript": "^3.9.5",
"url-loader": "^1.0.1", "url-loader": "^1.0.1",
"webpack": "^4.12.0", "webpack": "^4.43.0",
"webpack-cli": "^3.0.8", "webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.1.4" "webpack-dev-server": "^3.11.0"
} }
} }

View File

@@ -1,10 +1,11 @@
version: "2" version: "3"
services: services:
go-discord-bot: go-discord-bot:
image: mgerb/go-discord-bot:latest image: mgerb/go-discord-bot:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- 8080:8080 - 8088:8080
volumes: volumes:
- ./:/bot - ./:/bot
- /usr/local/bin/youtube-dl:/usr/bin/youtube-dl

View File

@@ -16,21 +16,22 @@ A soundboard bot for discord. Build with Go/React.
### With docker-compose ### With docker-compose
Make sure to create a `config.json` file in your data volume. Make sure to create a `config.json` file in your data volume.
Take a look at `config.template.json` for example congurations. Take a look at `config.template.json` for example configurations.
docker-compose.yml docker-compose.yml
``` ```
version: "2" version: "3"
services: services:
go-discord-bot: go-discord-bot:
image: mgerb/go-discord-bot:latest image: mgerb/go-discord-bot:latest
restart: unless-stopped restart: unless-stopped
ports: ports:
- 8080:8080 - 8088:8080
volumes: volumes:
- <path to your data directory>:/bot - <path to your data directory>:/bot
- /usr/local/bin/youtube-dl:/usr/bin/youtube-dl
``` ```
#### Running Bot Scripts #### Running Bot Scripts

116
server/Gopkg.lock generated
View File

@@ -2,256 +2,344 @@
[[projects]] [[projects]]
digest = "1:573fa46f8d413d4bc3f7cc5e86b2c43cb21559f4fb0a19d9874d228e28fdc07c"
name = "github.com/PuerkitoBio/goquery" name = "github.com/PuerkitoBio/goquery"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "2d2796f41742ece03e8086188fa4db16a3a0b458" revision = "2d2796f41742ece03e8086188fa4db16a3a0b458"
version = "v1.5.0" version = "v1.5.0"
[[projects]] [[projects]]
digest = "1:24ffaa1636eba8f0cfc7671121d05a9a2040605adb1927a93be88fbc2ea6cfdb"
name = "github.com/andybalholm/cascadia" name = "github.com/andybalholm/cascadia"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "b69f6c92dfc187ebfe3914df716c2647a3af0ba0" revision = "b69f6c92dfc187ebfe3914df716c2647a3af0ba0"
version = "v1.1.0" version = "v1.1.0"
[[projects]] [[projects]]
digest = "1:d87c9221a974263e3b369bfd3513707b2a53e27a6cd799d472f94dc6a6157e59"
name = "github.com/bwmarrin/discordgo" name = "github.com/bwmarrin/discordgo"
packages = ["."] packages = ["."]
revision = "dd99dea7adba674baa401e52362d6e330b50acf8" pruneopts = "UT"
version = "v0.20.1" revision = "ed4d6904961d1688b3f5601b3d73e95a71046734"
version = "v0.20.3"
[[projects]] [[projects]]
digest = "1:3ee1d175a75b911a659fbd860060874c4f503e793c5870d13e5a0ede529a63cf"
name = "github.com/gin-contrib/sse" name = "github.com/gin-contrib/sse"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "54d8467d122d380a14768b6b4e5cd7ca4755938f" revision = "54d8467d122d380a14768b6b4e5cd7ca4755938f"
version = "v0.1.0" version = "v0.1.0"
[[projects]] [[projects]]
digest = "1:d8bd2a337f6ff2188e08f72c614f2f3f0fd48e6a7b37a071b197e427d77d3a47"
name = "github.com/gin-gonic/gin" name = "github.com/gin-gonic/gin"
packages = [ packages = [
".", ".",
"binding", "binding",
"internal/json", "internal/json",
"render" "render",
] ]
pruneopts = "UT"
revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda" revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda"
version = "v1.4.0" version = "v1.4.0"
[[projects]] [[projects]]
branch = "master"
digest = "1:42b801064f0aeb1b9bad0e1b42edf27bc34485bec63b965b9b840e07e6074608"
name = "github.com/go-audio/audio" name = "github.com/go-audio/audio"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "7b2a6ca214808c64326280ac13268af853543f0b" revision = "7b2a6ca214808c64326280ac13268af853543f0b"
version = "v1.0.0"
[[projects]] [[projects]]
digest = "1:cc27c740a8fc8d79cfb01f11cbc46932cb0f24f8fa100e14854182284f5a0356"
name = "github.com/go-audio/riff" name = "github.com/go-audio/riff"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "50a86f77554da545dd17f61cf7f63a9111b4ee15" revision = "50a86f77554da545dd17f61cf7f63a9111b4ee15"
version = "v1.0.0" version = "v1.0.0"
[[projects]] [[projects]]
branch = "master"
digest = "1:2a143457bc56dc11e46e11d4d01b76feb6c831bd8ddf193e146aaf1674ed24cf"
name = "github.com/go-audio/wav" name = "github.com/go-audio/wav"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "cc323235893be1cbdb031cb52acfc0184b366870" revision = "cc323235893be1cbdb031cb52acfc0184b366870"
version = "v1.0.0"
[[projects]] [[projects]]
digest = "1:57ae8919194013fb07b8390fb8a32e700c12fdab96e8dc4bb15d5fe45dc43245"
name = "github.com/gobuffalo/envy" name = "github.com/gobuffalo/envy"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "909ea676d4c90832fefbf55a5a4fb04d8bef8931" revision = "909ea676d4c90832fefbf55a5a4fb04d8bef8931"
version = "v1.7.1" version = "v1.7.1"
[[projects]] [[projects]]
digest = "1:40849e8495ef81a84ff335ef65e23d33671b61e60e9db464fbab55f19f43f120"
name = "github.com/gobuffalo/packd" name = "github.com/gobuffalo/packd"
packages = [ packages = [
".", ".",
"internal/takeon/github.com/markbates/errx" "internal/takeon/github.com/markbates/errx",
] ]
pruneopts = "UT"
revision = "54ea459691466cfb630ccc276723fe3963f3e9d5" revision = "54ea459691466cfb630ccc276723fe3963f3e9d5"
version = "v0.3.0" version = "v0.3.0"
[[projects]] [[projects]]
digest = "1:6418b861412b06885ed9981efdc740bc5f025c55b7bfb66518929916ea8f5cb3"
name = "github.com/gobuffalo/packr" name = "github.com/gobuffalo/packr"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "e4f52d87ce714b0cda77bf66e4eadd57cada24cf" revision = "e4f52d87ce714b0cda77bf66e4eadd57cada24cf"
version = "v1.30.1" version = "v1.30.1"
[[projects]] [[projects]]
digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a"
name = "github.com/golang/protobuf" name = "github.com/golang/protobuf"
packages = ["proto"] packages = ["proto"]
pruneopts = "UT"
revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
version = "v1.3.2" version = "v1.3.2"
[[projects]] [[projects]]
digest = "1:e62657cca9badaa308d86e7716083e4c5933bb78e30a17743fc67f50be26f6f4"
name = "github.com/gorilla/websocket" name = "github.com/gorilla/websocket"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "c3e18be99d19e6b3e8f1559eea2c161a665c4b6b" revision = "c3e18be99d19e6b3e8f1559eea2c161a665c4b6b"
version = "v1.4.1" version = "v1.4.1"
[[projects]] [[projects]]
branch = "v2" branch = "v2"
digest = "1:92ac5796b86f454e9b8a9f0f2ceba033747aa8d8fe1fda89b9ec6d6176a431b6"
name = "github.com/hraban/opus" name = "github.com/hraban/opus"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "0f2e0b4fc6cd5710fddbb74ba2e5e02c1c1bc22b" revision = "0f2e0b4fc6cd5710fddbb74ba2e5e02c1c1bc22b"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:ae940e9156d0d778ce1991bcc99e58fa5ca2790ddf7c5f0bc05385854416f7a6"
name = "github.com/jinzhu/copier" name = "github.com/jinzhu/copier"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "b57f9002281ac48ed8cbc489b1e91121e1a0824c" revision = "b57f9002281ac48ed8cbc489b1e91121e1a0824c"
[[projects]] [[projects]]
digest = "1:464c34f75713bd24aede4940812a236c59f1d9b1b154af701a7c1a368828e732"
name = "github.com/jinzhu/gorm" name = "github.com/jinzhu/gorm"
packages = [ packages = [
".", ".",
"dialects/sqlite" "dialects/sqlite",
] ]
pruneopts = "UT"
revision = "81c17a7e2529c59efc4e74c5b32c1fb71fb12fa2" revision = "81c17a7e2529c59efc4e74c5b32c1fb71fb12fa2"
version = "v1.9.11" version = "v1.9.11"
[[projects]] [[projects]]
digest = "1:01ed62f8f4f574d8aff1d88caee113700a2b44c42351943fa73cc1808f736a50"
name = "github.com/jinzhu/inflection" name = "github.com/jinzhu/inflection"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "f5c5f50e6090ae76a29240b61ae2a90dd810112e" revision = "f5c5f50e6090ae76a29240b61ae2a90dd810112e"
version = "v1.0.0" version = "v1.0.0"
[[projects]] [[projects]]
digest = "1:ecd9aa82687cf31d1585d4ac61d0ba180e42e8a6182b85bd785fcca8dfeefc1b"
name = "github.com/joho/godotenv" name = "github.com/joho/godotenv"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "23d116af351c84513e1946b527c88823e476be13" revision = "23d116af351c84513e1946b527c88823e476be13"
version = "v1.3.0" version = "v1.3.0"
[[projects]] [[projects]]
digest = "1:beb5b4f42a25056f0aa291b5eadd21e2f2903a05d15dfe7caf7eaee7e12fa972"
name = "github.com/json-iterator/go" name = "github.com/json-iterator/go"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "03217c3e97663914aec3faafde50d081f197a0a2" revision = "03217c3e97663914aec3faafde50d081f197a0a2"
version = "1.1.8" version = "1.1.8"
[[projects]] [[projects]]
digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de"
name = "github.com/konsorten/go-windows-terminal-sequences" name = "github.com/konsorten/go-windows-terminal-sequences"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e"
version = "v1.0.2" version = "v1.0.2"
[[projects]] [[projects]]
digest = "1:d62282425ffb75047679d7e2c3b980eea7f82c05ef5fb9142ee617ebac6e7432"
name = "github.com/mattn/go-isatty" name = "github.com/mattn/go-isatty"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "88ba11cfdc67c7588b30042edf244b2875f892b6" revision = "88ba11cfdc67c7588b30042edf244b2875f892b6"
version = "v0.0.10" version = "v0.0.10"
[[projects]] [[projects]]
digest = "1:047349f9fa59b1c603d6a73f6bf9b03c9e2ac718f64a6ed04959ddc274903efc"
name = "github.com/mattn/go-sqlite3" name = "github.com/mattn/go-sqlite3"
packages = ["."] packages = ["."]
revision = "b612a2feea6aa87c6d052d9086572551df06497e" pruneopts = "UT"
version = "v1.11.0" revision = "baaf8a978416040e7f2d00ac36e345098d0588d8"
version = "v2.0.6"
[[projects]] [[projects]]
digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563"
name = "github.com/modern-go/concurrent" name = "github.com/modern-go/concurrent"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94"
version = "1.0.3" version = "1.0.3"
[[projects]] [[projects]]
digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855"
name = "github.com/modern-go/reflect2" name = "github.com/modern-go/reflect2"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd"
version = "1.0.1" version = "1.0.1"
[[projects]] [[projects]]
digest = "1:e09ada96a5a41deda4748b1659cc8953961799e798aea557257b56baee4ecaf3"
name = "github.com/rogpeppe/go-internal" name = "github.com/rogpeppe/go-internal"
packages = [ packages = [
"modfile", "modfile",
"module", "module",
"semver" "semver",
] ]
pruneopts = "UT"
revision = "d89504fbbf2c313df24867a5ffafcc9b847961ff" revision = "d89504fbbf2c313df24867a5ffafcc9b847961ff"
version = "v1.5.0" version = "v1.5.0"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:e39f2a5a4be01927e6cb70d37cd75cf361a3f1c2050e718d8aaf85aca735b2c5"
name = "github.com/rylio/ytdl" name = "github.com/rylio/ytdl"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "1f14ef2e151a8f8a1af2f318f518f26ff0980b31" revision = "1f14ef2e151a8f8a1af2f318f518f26ff0980b31"
[[projects]] [[projects]]
digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976"
name = "github.com/sirupsen/logrus" name = "github.com/sirupsen/logrus"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" revision = "839c75faf7f98a33d445d181f3018b5c3409a45e"
version = "v1.4.2" version = "v1.4.2"
[[projects]] [[projects]]
digest = "1:46aea6ffe39c3d95c13640c2515236ed3c5cdffc3c78c6c0ed4edec2caf7a0dc"
name = "github.com/tidwall/gjson" name = "github.com/tidwall/gjson"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "c5e72cdf74dff23857243dd662c465b810891c21" revision = "c5e72cdf74dff23857243dd662c465b810891c21"
version = "v1.3.2" version = "v1.3.2"
[[projects]] [[projects]]
digest = "1:8453ddbed197809ee8ca28b06bd04e127bec9912deb4ba451fea7a1eca578328"
name = "github.com/tidwall/match" name = "github.com/tidwall/match"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "33827db735fff6510490d69a8622612558a557ed" revision = "33827db735fff6510490d69a8622612558a557ed"
version = "v1.0.1" version = "v1.0.1"
[[projects]] [[projects]]
digest = "1:ddfe0a54e5f9b29536a6d7b2defa376f2cb2b6e4234d676d7ff214d5b097cb50"
name = "github.com/tidwall/pretty" name = "github.com/tidwall/pretty"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "1166b9ac2b65e46a43d8618d30d1554f4652d49b" revision = "1166b9ac2b65e46a43d8618d30d1554f4652d49b"
version = "v1.0.0" version = "v1.0.0"
[[projects]] [[projects]]
digest = "1:5a1cf4e370bc86137b58da2ae065e76526d32b11f62a7665f36dbd5f41fa95ff"
name = "github.com/ugorji/go" name = "github.com/ugorji/go"
packages = ["codec"] packages = ["codec"]
pruneopts = "UT"
revision = "23ab95ef5dc3b70286760af84ce2327a2b64ed62" revision = "23ab95ef5dc3b70286760af84ce2327a2b64ed62"
version = "v1.1.7" version = "v1.1.7"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:e29c6fd0d02e2eef9fe4594b8baaf884ed54c03fd3b2d465a416a9cb49d6c609"
name = "golang.org/x/crypto" name = "golang.org/x/crypto"
packages = [ packages = [
"internal/subtle", "internal/subtle",
"nacl/secretbox", "nacl/secretbox",
"poly1305", "poly1305",
"salsa20/salsa" "salsa20/salsa",
] ]
pruneopts = "UT"
revision = "87dc89f01550277dc22b74ffcf4cd89fa2f40f4c" revision = "87dc89f01550277dc22b74ffcf4cd89fa2f40f4c"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:0be3fc4126c5a734c67e77fb3befd681f9efe0d0774efd31bae8f5826238ca36"
name = "golang.org/x/net" name = "golang.org/x/net"
packages = [ packages = [
"html", "html",
"html/atom" "html/atom",
] ]
pruneopts = "UT"
revision = "ec77196f6094c3492a8b61f2c11cf937f78992ae" revision = "ec77196f6094c3492a8b61f2c11cf937f78992ae"
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:1ac2765de4a8311e9770f445eb5337a8872d807e70cd0e20f410feb28b16783c"
name = "golang.org/x/sys" name = "golang.org/x/sys"
packages = [ packages = [
"cpu", "cpu",
"unix" "unix",
] ]
pruneopts = "UT"
revision = "3e7259c5e7c2076bb2728047a3df75adb1bad8e5" revision = "3e7259c5e7c2076bb2728047a3df75adb1bad8e5"
[[projects]] [[projects]]
digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55"
name = "gopkg.in/dgrijalva/jwt-go.v3" name = "gopkg.in/dgrijalva/jwt-go.v3"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
version = "v3.2.0" version = "v3.2.0"
[[projects]] [[projects]]
digest = "1:cbc72c4c4886a918d6ab4b95e347ffe259846260f99ebdd8a198c2331cf2b2e9"
name = "gopkg.in/go-playground/validator.v8" name = "gopkg.in/go-playground/validator.v8"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf" revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf"
version = "v8.18.2" version = "v8.18.2"
[[projects]] [[projects]]
digest = "1:59f10c1537d2199d9115d946927fe31165959a95190849c82ff11e05803528b0"
name = "gopkg.in/yaml.v2" name = "gopkg.in/yaml.v2"
packages = ["."] packages = ["."]
pruneopts = "UT"
revision = "f221b8435cfb71e54062f6c6e99e9ade30b124d5" revision = "f221b8435cfb71e54062f6c6e99e9ade30b124d5"
version = "v2.2.4" version = "v2.2.4"
[solve-meta] [solve-meta]
analyzer-name = "dep" analyzer-name = "dep"
analyzer-version = 1 analyzer-version = 1
inputs-digest = "af66c232a13523e1da74c359337f9bc870571103b9358c6c0d1c160c350087af" input-imports = [
"github.com/bwmarrin/discordgo",
"github.com/gin-gonic/gin",
"github.com/go-audio/audio",
"github.com/go-audio/wav",
"github.com/gobuffalo/packr",
"github.com/hraban/opus",
"github.com/jinzhu/copier",
"github.com/jinzhu/gorm",
"github.com/jinzhu/gorm/dialects/sqlite",
"github.com/rylio/ytdl",
"github.com/sirupsen/logrus",
"github.com/tidwall/gjson",
"gopkg.in/dgrijalva/jwt-go.v3",
]
solver-name = "gps-cdcl" solver-name = "gps-cdcl"
solver-version = 1 solver-version = 1

View File

@@ -11,6 +11,10 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
// There's an issue with sqlite currently: https://github.com/mattn/go-sqlite3/issues/803
// Set env variables to fix temporarily
// export CGO_CFLAGS="-g -O2 -Wno-return-local-addr"
func init() { func init() {
log.SetLevel(log.DebugLevel) log.SetLevel(log.DebugLevel)
log.SetOutput(os.Stdout) log.SetOutput(os.Stdout)