Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c72dcd0ec3 | ||
|
|
61d500946e | ||
|
|
65bb218260 | ||
|
|
d8d90a8414 | ||
|
|
2e95aa0234 | ||
|
|
480f5b6cc9 | ||
|
|
97793ad622 | ||
|
|
d581a9bf32 | ||
|
|
13f80a6972 | ||
|
|
20bd455a44 | ||
|
|
cadef92efb | ||
|
|
f6f020ff48 | ||
|
|
a93139fcf2 | ||
|
|
d9ddfaf2cc | ||
|
|
05d4096766 | ||
|
|
6a33cceebb | ||
|
|
5cd626a5a4 | ||
|
|
e2f25eaab4 | ||
|
|
ea058baff5 | ||
|
|
d9e1efbaf0 | ||
|
|
af506f828d | ||
|
|
5c42616a3a | ||
|
|
6cc5e042d5 | ||
|
|
03e6f069c9 | ||
|
|
4db28f5c0b | ||
|
|
d876f4ced9 | ||
|
|
fb4d7977aa | ||
|
|
68a02e2f24 | ||
|
|
30394b35e5 | ||
|
|
87961c5081 | ||
|
|
562ec6acaf | ||
|
|
3169953f3f | ||
|
|
d119425236 | ||
|
|
ce1bbbc445 | ||
|
|
f4ec8a7a49 | ||
|
|
bec52ad5a5 | ||
|
|
5411730a96 | ||
|
|
187f9816ca | ||
|
|
feab8e661c | ||
|
|
96b63a4e83 | ||
|
|
fcddca2226 | ||
|
|
28d78bdb8c | ||
|
|
35882993c2 | ||
|
|
85bcb31d56 | ||
|
|
23c0434ed3 | ||
|
|
e9adc05536 | ||
|
|
b8ee6a1505 | ||
|
|
ac46753546 | ||
|
|
d16521e5e3 | ||
|
|
4955f4bf88 | ||
|
|
c3d2073b2b | ||
|
|
1ddc4d4c36 | ||
|
|
d66a25a525 | ||
|
|
6c05518146 |
52
.github/workflows/main.yml
vendored
Normal file
52
.github/workflows/main.yml
vendored
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
# Controls when the action will run. Triggers the workflow on push to master or development
|
||||||
|
# with a tag like v1.0.0 or v1.0.0-dev
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v[0-9]+.[0-9]+.[0-9]+
|
||||||
|
- v[0-9]+.[0-9]+.[0-9]+-[a-zA-Z]+
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Get Version
|
||||||
|
id: get_version
|
||||||
|
uses: battila7/get-version-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Build container image
|
||||||
|
env:
|
||||||
|
IMAGE_TAG: ${{ steps.get_version.outputs.version-without-v }}
|
||||||
|
run: docker build -t registry.digitalocean.com/djpianalto/goff:$IMAGE_TAG .
|
||||||
|
|
||||||
|
- name: Install doctl
|
||||||
|
uses: digitalocean/action-doctl@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
|
||||||
|
|
||||||
|
- name: Login to DigitalOcean Container Registry with short-lived credentials
|
||||||
|
run: doctl registry login --expiry-seconds 600
|
||||||
|
|
||||||
|
- name: Push image to DigitalOcean Container Registry
|
||||||
|
env:
|
||||||
|
IMAGE_TAG: ${{ steps.get_version.outputs.version-without-v }}
|
||||||
|
run: docker push registry.digitalocean.com/djpianalto/goff:$IMAGE_TAG
|
||||||
|
|
||||||
|
- name: Update deployment file
|
||||||
|
run: TAG=${{ steps.get_version.outputs.version-without-v }} && sed -i 's|<IMAGE>|registry.digitalocean.com/djpianalto/goff:'${TAG}'|' $GITHUB_WORKSPACE/deployment.yml
|
||||||
|
|
||||||
|
- name: Save DigitalOcean kubeconfig with short-lived credentials
|
||||||
|
run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 discord-bots
|
||||||
|
|
||||||
|
- name: Deploy to DigitalOcean Kubernetes
|
||||||
|
run: kubectl apply -f $GITHUB_WORKSPACE/deployment.yml
|
||||||
|
|
||||||
|
- name: Verify deployment
|
||||||
|
run: kubectl rollout status deployment/goff
|
||||||
19
Dockerfile
19
Dockerfile
@ -1,13 +1,20 @@
|
|||||||
FROM golang:1.14-alpine
|
FROM golang:1.14-alpine as dev
|
||||||
|
|
||||||
WORKDIR /go/src/Goff
|
WORKDIR /go/src/Goff
|
||||||
COPY ./go.mod .
|
COPY ./go.mod .
|
||||||
|
COPY ./go.sum .
|
||||||
|
|
||||||
RUN apk add --no-cache git
|
RUN go mod download
|
||||||
|
|
||||||
RUN go get -d -v ./...
|
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN go install -v ./...
|
RUN go install github.com/dustinpianalto/goff/...
|
||||||
|
|
||||||
ENTRYPOINT /go/bin/goff
|
CMD [ "go", "run", "cmd/goff/main.go"]
|
||||||
|
|
||||||
|
from alpine
|
||||||
|
|
||||||
|
WORKDIR /bin
|
||||||
|
|
||||||
|
COPY --from=dev /go/bin/goff ./goff
|
||||||
|
|
||||||
|
CMD [ "goff" ]
|
||||||
|
|||||||
BIN
cmd/goff/main
Executable file
BIN
cmd/goff/main
Executable file
Binary file not shown.
@ -4,10 +4,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/events"
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/exts"
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/guild_management"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/logging"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/tasks"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/user_management"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
|
"github.com/dustinpianalto/goff/internal/services"
|
||||||
|
"github.com/dustinpianalto/goff/pkg/email"
|
||||||
|
|
||||||
//"github.com/MikeModder/anpan"
|
//"github.com/MikeModder/anpan"
|
||||||
"os"
|
"os"
|
||||||
@ -34,11 +39,20 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
dg.State.MaxMessageCount = 100
|
dg.State.MaxMessageCount = 100
|
||||||
|
dg.StateEnabled = true
|
||||||
|
|
||||||
utils.ConnectDatabase(os.Getenv("DATABASE_URL"))
|
dg.Identify = discordgo.Identify{
|
||||||
utils.InitializeDatabase()
|
Intents: discordgo.MakeIntent(discordgo.IntentsAll),
|
||||||
|
}
|
||||||
|
|
||||||
|
postgres.ConnectDatabase(os.Getenv("DATABASE_URL"))
|
||||||
|
postgres.InitializeDatabase()
|
||||||
//utils.LoadTestData()
|
//utils.LoadTestData()
|
||||||
|
|
||||||
|
us := &postgres.UserService{DB: postgres.DB}
|
||||||
|
gs := &postgres.GuildService{DB: postgres.DB}
|
||||||
|
rs := &postgres.RoleService{DB: postgres.DB}
|
||||||
|
|
||||||
//prefixes := []string{
|
//prefixes := []string{
|
||||||
// "Go.",
|
// "Go.",
|
||||||
//}
|
//}
|
||||||
@ -46,12 +60,7 @@ func main() {
|
|||||||
"351794468870946827",
|
"351794468870946827",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arguments are:
|
manager := disgoman.CommandManager{
|
||||||
// prefixes - []string
|
|
||||||
// owner ids - []string
|
|
||||||
// ignore bots - bool
|
|
||||||
// check perms - bool
|
|
||||||
handler := disgoman.CommandManager{
|
|
||||||
Prefixes: getPrefixes,
|
Prefixes: getPrefixes,
|
||||||
Owners: owners,
|
Owners: owners,
|
||||||
StatusManager: disgoman.GetDefaultStatusManager(),
|
StatusManager: disgoman.GetDefaultStatusManager(),
|
||||||
@ -62,18 +71,19 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add Command Handlers
|
// Add Command Handlers
|
||||||
exts.AddCommandHandlers(&handler)
|
exts.AddCommandHandlers(&manager)
|
||||||
|
services.InitalizeServices(us, gs, rs)
|
||||||
|
|
||||||
//if _, ok := handler.Commands["help"]; !ok {
|
//if _, ok := handler.Commands["help"]; !ok {
|
||||||
// handler.AddDefaultHelpCommand()
|
// handler.AddDefaultHelpCommand()
|
||||||
//}
|
//}
|
||||||
|
|
||||||
dg.AddHandler(handler.OnMessage)
|
dg.AddHandler(manager.OnMessage)
|
||||||
dg.AddHandler(handler.StatusManager.OnReady)
|
dg.AddHandler(manager.StatusManager.OnReady)
|
||||||
dg.AddHandler(events.OnMessageUpdate)
|
dg.AddHandler(guild_management.OnMessageUpdate)
|
||||||
dg.AddHandler(events.OnMessageDelete)
|
dg.AddHandler(guild_management.OnMessageDelete)
|
||||||
dg.AddHandler(events.OnGuildMemberAddLogging)
|
dg.AddHandler(user_management.OnGuildMemberAddLogging)
|
||||||
dg.AddHandler(events.OnGuildMemberRemoveLogging)
|
dg.AddHandler(user_management.OnGuildMemberRemoveLogging)
|
||||||
|
|
||||||
err = dg.Open()
|
err = dg.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -82,15 +92,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start the Error handler in a goroutine
|
// Start the Error handler in a goroutine
|
||||||
go ErrorHandler(handler.ErrorChannel)
|
go ErrorHandler(manager.ErrorChannel)
|
||||||
|
|
||||||
// Start the Logging handler in a goroutine
|
// Start the Logging handler in a goroutine
|
||||||
go utils.LoggingHandler(utils.LoggingChannel)
|
go logging.LoggingHandler(logging.LoggingChannel)
|
||||||
|
|
||||||
// Start the task handler in a goroutine
|
// Start the task handler in a goroutine
|
||||||
go utils.ProcessTasks(dg, 1)
|
go tasks.ProcessTasks(dg, 1)
|
||||||
|
|
||||||
go utils.RecieveEmail(dg)
|
go email.RecieveEmail(dg)
|
||||||
|
|
||||||
fmt.Println("The Bot is now running.")
|
fmt.Println("The Bot is now running.")
|
||||||
sc := make(chan os.Signal, 1)
|
sc := make(chan os.Signal, 1)
|
||||||
@ -106,7 +116,7 @@ func main() {
|
|||||||
|
|
||||||
func getPrefixes(guildID string) []string {
|
func getPrefixes(guildID string) []string {
|
||||||
queryString := "Select prefix from prefixes p, x_guilds_prefixes xgp where xgp.guild_id = $1 and xgp.prefix_id = p.id"
|
queryString := "Select prefix from prefixes p, x_guilds_prefixes xgp where xgp.guild_id = $1 and xgp.prefix_id = p.id"
|
||||||
rows, err := utils.Database.Query(queryString, guildID)
|
rows, err := postgres.DB.Query(queryString, guildID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return []string{"Go.", "go."}
|
return []string{"Go.", "go."}
|
||||||
@ -121,6 +131,9 @@ func getPrefixes(guildID string) []string {
|
|||||||
}
|
}
|
||||||
prefixes = append(prefixes, prefix)
|
prefixes = append(prefixes, prefix)
|
||||||
}
|
}
|
||||||
|
if len(prefixes) == 0 {
|
||||||
|
prefixes = append(prefixes, "Go.", "go.")
|
||||||
|
}
|
||||||
return prefixes
|
return prefixes
|
||||||
}
|
}
|
||||||
|
|
||||||
46
deployment.yml
Normal file
46
deployment.yml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: goff
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: goff
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: goff
|
||||||
|
strategy:
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 1
|
||||||
|
maxUnavailable: 1
|
||||||
|
minReadySeconds: 120
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: goff
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: goff
|
||||||
|
image: <IMAGE>
|
||||||
|
env:
|
||||||
|
- name: DATABASE_URL
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: goff
|
||||||
|
key: database_url
|
||||||
|
- name: DISCORDGO_TOKEN
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: goff
|
||||||
|
key: discord_token
|
||||||
|
- name: GOFF_EMAIL_USERNAME
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: goff
|
||||||
|
key: email_username
|
||||||
|
- name: GOFF_EMAIL_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: goff
|
||||||
|
key: email_password
|
||||||
@ -1,49 +0,0 @@
|
|||||||
package exts
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
func interleave(ctx disgoman.Context, args []string) {
|
|
||||||
if len(args) == 2 {
|
|
||||||
x, err := strconv.ParseInt(args[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
y, err := strconv.ParseInt(args[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var z = int64(0)
|
|
||||||
for i := 0; i < 64; i++ {
|
|
||||||
x_masked_i := x & (1 << i)
|
|
||||||
y_masked_i := y & (1 << i)
|
|
||||||
|
|
||||||
z |= x_masked_i << i
|
|
||||||
z |= y_masked_i << (i + 1)
|
|
||||||
}
|
|
||||||
ctx.Send(fmt.Sprintf("%v", z))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func deinterleave(ctx disgoman.Context, args []string) {
|
|
||||||
if len(args) == 1 {
|
|
||||||
z, err := strconv.ParseInt(args[0], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var x = int64(0)
|
|
||||||
var y = int64(0)
|
|
||||||
i := 0
|
|
||||||
for z > 0 {
|
|
||||||
x |= (z & 1) << i
|
|
||||||
z >>= 1
|
|
||||||
y |= (z & 1) << i
|
|
||||||
z >>= 1
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
ctx.Send(fmt.Sprintf("(%v, %v)", x, y))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,290 +0,0 @@
|
|||||||
package exts
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Guild management commands
|
|
||||||
|
|
||||||
func loggingChannel(ctx disgoman.Context, args []string) {
|
|
||||||
var idString string
|
|
||||||
if len(args) > 0 {
|
|
||||||
idString = args[0]
|
|
||||||
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
|
||||||
idString = idString[2 : len(idString)-1]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idString = ""
|
|
||||||
}
|
|
||||||
fmt.Println(idString)
|
|
||||||
if idString == "" {
|
|
||||||
_, err := utils.Database.Exec("UPDATE guilds SET logging_channel='' WHERE id=$1;", ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Logging Channel Updated.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.Channel(idString)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Can't find that channel.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channel.GuildID != ctx.Guild.ID {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "The channel passed is not in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, err = utils.Database.Exec("UPDATE guilds SET logging_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Logging Channel Updated.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getLoggingChannel(ctx disgoman.Context, _ []string) {
|
|
||||||
var channelID string
|
|
||||||
row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", ctx.Guild.ID)
|
|
||||||
err := row.Scan(&channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error getting data from the database.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channelID == "" {
|
|
||||||
_, _ = ctx.Send("The logging channel is not set.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send(fmt.Sprintf("The logging channel is currently %s", channel.Mention()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func welcomeChannel(ctx disgoman.Context, args []string) {
|
|
||||||
var idString string
|
|
||||||
if len(args) > 0 {
|
|
||||||
idString = args[0]
|
|
||||||
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
|
||||||
idString = idString[2 : len(idString)-1]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idString = ""
|
|
||||||
}
|
|
||||||
fmt.Println(idString)
|
|
||||||
if idString == "" {
|
|
||||||
_, err := utils.Database.Exec("UPDATE guilds SET welcome_channel='' WHERE id=$1;", ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Welcomer Disabled.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.Channel(idString)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Can't find that channel.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channel.GuildID != ctx.Guild.ID {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "The channel passed is not in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, err = utils.Database.Exec("UPDATE guilds SET welcome_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Welcome Channel Updated.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func getWelcomeChannel(ctx disgoman.Context, _ []string) {
|
|
||||||
var channelID string
|
|
||||||
row := utils.Database.QueryRow("SELECT welcome_channel FROM guilds where id=$1", ctx.Guild.ID)
|
|
||||||
err := row.Scan(&channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error getting data from the database.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channelID == "" {
|
|
||||||
_, _ = ctx.Send("The welcomer is disabled.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send(fmt.Sprintf("The welcome channel is currently %s", channel.Mention()))
|
|
||||||
}
|
|
||||||
|
|
||||||
func addGuildCommand(ctx disgoman.Context, args []string) {
|
|
||||||
var guildID string
|
|
||||||
row := utils.Database.QueryRow("SELECT id FROM guilds where id=$1", ctx.Guild.ID)
|
|
||||||
err := row.Scan(&guildID)
|
|
||||||
if err == nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "This guild is already in my database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = utils.Database.Query("INSERT INTO guilds (id) VALUES ($1)", ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "There was a problem inserting this guild into the database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("This guild has been added.")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func puzzleChannel(ctx disgoman.Context, args []string) {
|
|
||||||
var idString string
|
|
||||||
if len(args) > 0 {
|
|
||||||
idString = args[0]
|
|
||||||
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
|
||||||
idString = idString[2 : len(idString)-1]
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
idString = ""
|
|
||||||
}
|
|
||||||
fmt.Println(idString)
|
|
||||||
if idString == "" {
|
|
||||||
_, err := utils.Database.Exec("UPDATE guilds SET puzzle_channel='' WHERE id=$1;", ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Puzzle Channel Updated.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.Channel(idString)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Can't find that channel.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channel.GuildID != ctx.Guild.ID {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "The channel passed is not in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, err = utils.Database.Exec("UPDATE guilds SET puzzle_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID)
|
|
||||||
if err != nil {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error Updating Database",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send("Puzzle Channel Updated.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPuzzleChannel(ctx disgoman.Context, _ []string) {
|
|
||||||
var channelID string
|
|
||||||
row := utils.Database.QueryRow("SELECT puzzle_channel FROM guilds where id=$1", ctx.Guild.ID)
|
|
||||||
err := row.Scan(&channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "Error getting data from the database.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if channelID == "" {
|
|
||||||
_, _ = ctx.Send("The puzzle channel is not set.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
_, _ = ctx.Send(fmt.Sprintf("The puzzle channel is currently %s", channel.Mention()))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@ -1,207 +0,0 @@
|
|||||||
package exts
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
)
|
|
||||||
|
|
||||||
func AddCommandHandlers(h *disgoman.CommandManager) {
|
|
||||||
// Arguments:
|
|
||||||
// name - command name - string
|
|
||||||
// desc - command description - string
|
|
||||||
// owneronly - only allow owners to run - bool
|
|
||||||
// hidden - hide command from non-owners - bool
|
|
||||||
// perms - permissisions required - anpan.Permission (int)
|
|
||||||
// type - command type, sets where the command is available
|
|
||||||
// run - function to run - func(anpan.Context, []string) / CommandRunFunc
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "ping",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Check the bot's ping",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: pingCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "say",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Repeat a message",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
SanitizeEveryone: true,
|
|
||||||
Invoke: sayCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "user",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Get user info",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: userCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "git",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Show my github link",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: gitCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "tag",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Get a tag",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: tagCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "addtag",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Add a tag",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
SanitizeEveryone: true,
|
|
||||||
Invoke: addTagCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "invite",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Get the invite link for this bot or others",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: inviteCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "P",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Interpret a P\" program and return the results",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: pCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "set-logging-channel",
|
|
||||||
Aliases: []string{"slc"},
|
|
||||||
Description: "Set the channel logging messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: loggingChannel,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "get-logging-channel",
|
|
||||||
Aliases: []string{"glc"},
|
|
||||||
Description: "Gets the channel logging messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: getLoggingChannel,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "set-welcome-channel",
|
|
||||||
Aliases: []string{"swc"},
|
|
||||||
Description: "Set the channel welcome messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: welcomeChannel,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "get-welcome-channel",
|
|
||||||
Aliases: []string{"gwc"},
|
|
||||||
Description: "Gets the channel welcome messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: getWelcomeChannel,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "kick",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Kicks the given user with the given reason",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionKickMembers,
|
|
||||||
Invoke: kickUserCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "addGuild",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Adds the current guild to the database",
|
|
||||||
OwnerOnly: true,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: addGuildCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "ban",
|
|
||||||
Aliases: []string{"ban-no-delete"},
|
|
||||||
Description: "Bans the given user with the given reason",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionBanMembers,
|
|
||||||
Invoke: banUserCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "unban",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Unbans the given user",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionBanMembers,
|
|
||||||
Invoke: unbanUserCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "remind",
|
|
||||||
Aliases: nil,
|
|
||||||
Description: "Remind me at a later time",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: addReminderCommand,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "encode",
|
|
||||||
Aliases: []string{"e"},
|
|
||||||
Description: "Encode 2 numbers",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: interleave,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "decode",
|
|
||||||
Aliases: []string{"d"},
|
|
||||||
Description: "Decode 1 number into 2",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: 0,
|
|
||||||
Invoke: deinterleave,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "set-puzzle-channel",
|
|
||||||
Aliases: []string{"spc"},
|
|
||||||
Description: "Set the channel puzzle messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: puzzleChannel,
|
|
||||||
})
|
|
||||||
_ = h.AddCommand(&disgoman.Command{
|
|
||||||
Name: "get-puzzle-channel",
|
|
||||||
Aliases: []string{"gpc"},
|
|
||||||
Description: "Gets the channel puzzle messages will be sent to.",
|
|
||||||
OwnerOnly: false,
|
|
||||||
Hidden: false,
|
|
||||||
RequiredPermissions: disgoman.PermissionManageServer,
|
|
||||||
Invoke: getPuzzleChannel,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,77 +0,0 @@
|
|||||||
package utils
|
|
||||||
|
|
||||||
import "log"
|
|
||||||
|
|
||||||
type postfix struct {
|
|
||||||
Name string
|
|
||||||
Invoke func(bool) error
|
|
||||||
}
|
|
||||||
|
|
||||||
var postfixes = []postfix{
|
|
||||||
postfix{
|
|
||||||
Name: "1_Update_Guild_for_Puzzle",
|
|
||||||
Invoke: updateGuildForPuzzle,
|
|
||||||
},
|
|
||||||
postfix{
|
|
||||||
Name: "1_Update_X_Guild_Prefixes_to_add_ID",
|
|
||||||
Invoke: updateXGuildPrefixesToAddID,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func RunPostfixes() {
|
|
||||||
for _, postfix := range postfixes {
|
|
||||||
queryString := "SELECT * from postfixes where name = $1"
|
|
||||||
rows, err := Database.Query(queryString, postfix.Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if rows.Next() {
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
err := postfix.Invoke(false)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
_, err = Database.Exec("INSERT INTO postfixes (name) VALUES ($1)", postfix.Name)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateGuildForPuzzle(revert bool) error {
|
|
||||||
var queryString string
|
|
||||||
if !revert {
|
|
||||||
queryString = `ALTER TABLE guilds
|
|
||||||
ADD COLUMN puzzle_channel varchar(30) not null default ''`
|
|
||||||
} else {
|
|
||||||
queryString = `ALTER TABLE guilds
|
|
||||||
DROP COLUMN puzzleChat`
|
|
||||||
}
|
|
||||||
_, err := Database.Exec(queryString)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateXGuildPrefixesToAddID(revert bool) error {
|
|
||||||
var queryString string
|
|
||||||
if !revert {
|
|
||||||
queryString = `ALTER TABLE x_guilds_prefixes
|
|
||||||
ADD COLUMN id serial primary key`
|
|
||||||
} else {
|
|
||||||
queryString = `ALTER TABLE x_guilds_prefixes
|
|
||||||
DROP COLUMN id`
|
|
||||||
}
|
|
||||||
_, err := Database.Exec(queryString)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
package utils
|
|
||||||
|
|
||||||
type Guild struct {
|
|
||||||
ID string
|
|
||||||
WelcomeMessage string
|
|
||||||
GoodbyeMessage string
|
|
||||||
LoggingChannel string
|
|
||||||
WelcomeChannel string
|
|
||||||
PuzzleChannel string
|
|
||||||
}
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
# goff-db:
|
|
||||||
# image: postgres
|
|
||||||
# ports:
|
|
||||||
# - "5432:5432"
|
|
||||||
# volumes:
|
|
||||||
# - "${PWD}/postgres.conf:/etc/postgresql/postgresql.conf"
|
|
||||||
# - "goff-db:/var/lib/postgresql/data:rw"
|
|
||||||
# env_file: ${PWD}/.env
|
|
||||||
|
|
||||||
goff:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: "${PWD}/Dockerfile"
|
|
||||||
env_file: ${PWD}/.env
|
|
||||||
logging:
|
|
||||||
driver: awslogs
|
|
||||||
options:
|
|
||||||
awslogs-region: us-east-1
|
|
||||||
awslogs-group: "/docker/goff/production"
|
|
||||||
# depends_on:
|
|
||||||
# - goff-db
|
|
||||||
environment:
|
|
||||||
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?sslmode=disable
|
|
||||||
# links:
|
|
||||||
# - goff-db:goff.db
|
|
||||||
|
|
||||||
#volumes:
|
|
||||||
# goff-db:
|
|
||||||
# external: true
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
version: "3"
|
|
||||||
|
|
||||||
services:
|
|
||||||
# goff-db:
|
|
||||||
# image: postgres
|
|
||||||
# ports:
|
|
||||||
# - "5432:5432"
|
|
||||||
# volumes:
|
|
||||||
# - "${PWD}/postgres.conf:/etc/postgresql/postgresql.conf"
|
|
||||||
# - "goff-db:/var/lib/postgresql/data:rw"
|
|
||||||
# env_file: ${PWD}/.env
|
|
||||||
|
|
||||||
goff:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: "${PWD}/Dockerfile"
|
|
||||||
env_file: ${PWD}/.env
|
|
||||||
# logging:
|
|
||||||
# driver: awslogs
|
|
||||||
# options:
|
|
||||||
# awslogs-region: us-east-1
|
|
||||||
# awslogs-group: "/docker/goff/production"
|
|
||||||
# depends_on:
|
|
||||||
# - goff-db
|
|
||||||
environment:
|
|
||||||
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}?sslmode=disable
|
|
||||||
# links:
|
|
||||||
# - goff-db:goff.db
|
|
||||||
|
|
||||||
#volumes:
|
|
||||||
# goff-db:
|
|
||||||
# external: true
|
|
||||||
7
go.mod
7
go.mod
@ -1,10 +1,11 @@
|
|||||||
module djpianalto.com/goff
|
module github.com/dustinpianalto/goff
|
||||||
|
|
||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/bwmarrin/discordgo v0.20.3-0.20200525154655-ca64123b05de
|
github.com/bwmarrin/discordgo v0.22.0
|
||||||
github.com/dustinpianalto/disgoman v0.0.10
|
github.com/dustinpianalto/disgoman v0.0.15
|
||||||
|
github.com/dustinpianalto/rpnparse v1.0.1
|
||||||
github.com/emersion/go-imap v1.0.5
|
github.com/emersion/go-imap v1.0.5
|
||||||
github.com/emersion/go-message v0.12.0
|
github.com/emersion/go-message v0.12.0
|
||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||||
|
|||||||
10
go.sum
10
go.sum
@ -4,11 +4,21 @@ github.com/bwmarrin/discordgo v0.20.2 h1:nA7jiTtqUA9lT93WL2jPjUp8ZTEInRujBdx1C9g
|
|||||||
github.com/bwmarrin/discordgo v0.20.2/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q=
|
github.com/bwmarrin/discordgo v0.20.2/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q=
|
||||||
github.com/bwmarrin/discordgo v0.20.3-0.20200525154655-ca64123b05de h1:0TOVVwGrmv0PA+/vuekQIRY9jJ9rcHYnicIaph3/4S4=
|
github.com/bwmarrin/discordgo v0.20.3-0.20200525154655-ca64123b05de h1:0TOVVwGrmv0PA+/vuekQIRY9jJ9rcHYnicIaph3/4S4=
|
||||||
github.com/bwmarrin/discordgo v0.20.3-0.20200525154655-ca64123b05de/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M=
|
github.com/bwmarrin/discordgo v0.20.3-0.20200525154655-ca64123b05de/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M=
|
||||||
|
github.com/bwmarrin/discordgo v0.22.0 h1:uBxY1HmlVCsW1IuaPjpCGT6A2DBwRn0nvOguQIxDdFM=
|
||||||
|
github.com/bwmarrin/discordgo v0.22.0/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dustinpianalto/disgoman v0.0.10 h1:UzmvMpOi4peF59tXGaNfVU+ePHs1hILa6gQbjxjWQ9g=
|
github.com/dustinpianalto/disgoman v0.0.10 h1:UzmvMpOi4peF59tXGaNfVU+ePHs1hILa6gQbjxjWQ9g=
|
||||||
github.com/dustinpianalto/disgoman v0.0.10/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g=
|
github.com/dustinpianalto/disgoman v0.0.10/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.12 h1:dLptU2ZTUZJaLBOKeE6qjuL8gqdAr6ehHSOtfHmUpL8=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.12/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.14 h1:hsk56JATBE5eH5GPCDGeiTdYxok4m+edSYiYz5Uj8uo=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.14/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.15 h1:kdIw6jhC82WBut7+4BarqxBw06dozU+Hu47LQzkkoGM=
|
||||||
|
github.com/dustinpianalto/disgoman v0.0.15/go.mod h1:v3FM6n+4dH9XlvO+IDx6MN3DUnGq6YVDBvy1A1k202g=
|
||||||
|
github.com/dustinpianalto/rpnparse v1.0.1 h1:ZvH1/RIe5hh3RGSAXOgtngEDHNPTF+DMh88XFWpQjzY=
|
||||||
|
github.com/dustinpianalto/rpnparse v1.0.1/go.mod h1:SzFbQb+Eed5gYCtDu/SYEXXwdPtWkDg9oaL1xQtN1BY=
|
||||||
github.com/emersion/go-imap v1.0.5 h1:8xg/d2wo2BBP3AEP5AOaM/6i8887RGyVW2st/IVHWUw=
|
github.com/emersion/go-imap v1.0.5 h1:8xg/d2wo2BBP3AEP5AOaM/6i8887RGyVW2st/IVHWUw=
|
||||||
github.com/emersion/go-imap v1.0.5/go.mod h1:yKASt+C3ZiDAiCSssxg9caIckWF/JG7ZQTO7GAmvicU=
|
github.com/emersion/go-imap v1.0.5/go.mod h1:yKASt+C3ZiDAiCSssxg9caIckWF/JG7ZQTO7GAmvicU=
|
||||||
github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
|
github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
|
||||||
|
|||||||
9
goff.go
Normal file
9
goff.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package goff
|
||||||
|
|
||||||
|
import "github.com/dustinpianalto/disgoman"
|
||||||
|
|
||||||
|
type CommandManager struct {
|
||||||
|
UserService UserService
|
||||||
|
GuildService GuildService
|
||||||
|
disgoman.CommandManager
|
||||||
|
}
|
||||||
22
guild.go
Normal file
22
guild.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package goff
|
||||||
|
|
||||||
|
import "database/sql"
|
||||||
|
|
||||||
|
type Guild struct {
|
||||||
|
ID string
|
||||||
|
WelcomeMessage string
|
||||||
|
GoodbyeMessage string
|
||||||
|
LoggingChannel string
|
||||||
|
WelcomeChannel string
|
||||||
|
PuzzleChannel string
|
||||||
|
PuzzleRole sql.NullString
|
||||||
|
Prefixes []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type GuildService interface {
|
||||||
|
Guild(id string) (*Guild, error)
|
||||||
|
CreateGuild(g *Guild) error
|
||||||
|
DeleteGuild(g *Guild) error
|
||||||
|
GuildUsers(g *Guild) ([]*User, error)
|
||||||
|
UpdateGuild(g *Guild) error
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package discord_utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package discord_utils
|
||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
134
internal/exts/fun/fun.go
Normal file
134
internal/exts/fun/fun.go
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package fun
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/rpnparse"
|
||||||
|
)
|
||||||
|
|
||||||
|
var InterleaveCommand = &disgoman.Command{
|
||||||
|
Name: "encode",
|
||||||
|
Aliases: []string{"e"},
|
||||||
|
Description: "Encode 2 numbers",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: interleaveFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func interleaveFunc(ctx disgoman.Context, args []string) {
|
||||||
|
if len(args) == 2 {
|
||||||
|
x, err := strconv.ParseInt(args[0], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
y, err := strconv.ParseInt(args[1], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var z = int64(0)
|
||||||
|
for i := 0; i < 64; i++ {
|
||||||
|
x_masked_i := x & (1 << i)
|
||||||
|
y_masked_i := y & (1 << i)
|
||||||
|
|
||||||
|
z |= x_masked_i << i
|
||||||
|
z |= y_masked_i << (i + 1)
|
||||||
|
}
|
||||||
|
ctx.Send(fmt.Sprintf("%v", z))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var DeinterleaveCommand = &disgoman.Command{
|
||||||
|
Name: "decode",
|
||||||
|
Aliases: []string{"d"},
|
||||||
|
Description: "Decode 1 number into 2",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: deinterleaveFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func deinterleaveFunc(ctx disgoman.Context, args []string) {
|
||||||
|
if len(args) == 1 {
|
||||||
|
z, err := strconv.ParseInt(args[0], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var x = int64(0)
|
||||||
|
var y = int64(0)
|
||||||
|
i := 0
|
||||||
|
for z > 0 {
|
||||||
|
x |= (z & 1) << i
|
||||||
|
z >>= 1
|
||||||
|
y |= (z & 1) << i
|
||||||
|
z >>= 1
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
ctx.Send(fmt.Sprintf("(%v, %v)", x, y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var GenerateRPNCommand = &disgoman.Command{
|
||||||
|
Name: "RPN",
|
||||||
|
Aliases: []string{"rpn"},
|
||||||
|
Description: "Convert infix to rpn",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: generateRPNFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateRPNFunc(ctx disgoman.Context, args []string) {
|
||||||
|
rpn, err := rpnparse.GenerateRPN(args)
|
||||||
|
if err != nil {
|
||||||
|
ctx.Send(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Send(rpn)
|
||||||
|
}
|
||||||
|
|
||||||
|
var ParseRPNCommand = &disgoman.Command{
|
||||||
|
Name: "ParseRPN",
|
||||||
|
Aliases: []string{"PRPN", "prpn"},
|
||||||
|
Description: "Parse RPN string and return the result",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: parseRPNFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseRPNFunc(ctx disgoman.Context, args []string) {
|
||||||
|
res, err := rpnparse.ParseRPN(args)
|
||||||
|
if err != nil {
|
||||||
|
ctx.Send(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Send(fmt.Sprintf("The result is: %v", res))
|
||||||
|
}
|
||||||
|
|
||||||
|
var SolveCommand = &disgoman.Command{
|
||||||
|
Name: "solve",
|
||||||
|
Aliases: []string{"math", "infix"},
|
||||||
|
Description: "Solve infix equation and return the result",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: solveFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func solveFunc(ctx disgoman.Context, args []string) {
|
||||||
|
rpn, err := rpnparse.GenerateRPN(args)
|
||||||
|
if err != nil {
|
||||||
|
ctx.Send(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, err := rpnparse.ParseRPN(strings.Split(rpn, " "))
|
||||||
|
if err != nil {
|
||||||
|
ctx.Send(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Send(fmt.Sprintf("The result is: %v", res))
|
||||||
|
}
|
||||||
476
internal/exts/guild_management/guild.go
Normal file
476
internal/exts/guild_management/guild.go
Normal file
@ -0,0 +1,476 @@
|
|||||||
|
package guild_management
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
|
"github.com/dustinpianalto/goff/internal/services"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Guild management commands
|
||||||
|
var SetLoggingChannelCommand = &disgoman.Command{
|
||||||
|
Name: "set-logging-channel",
|
||||||
|
Aliases: []string{"slc"},
|
||||||
|
Description: "Set the channel logging messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: setLoggingChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func setLoggingChannelFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var idString string
|
||||||
|
if len(args) > 0 {
|
||||||
|
idString = args[0]
|
||||||
|
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
||||||
|
idString = idString[2 : len(idString)-1]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idString = ""
|
||||||
|
}
|
||||||
|
guild, err := services.GuildService.Guild(ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if idString == "" {
|
||||||
|
guild.LoggingChannel = idString
|
||||||
|
err = services.GuildService.UpdateGuild(guild)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Logging Channel Updated.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.Channel(idString)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that channel.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channel.GuildID != ctx.Guild.ID {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "The channel passed is not in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
guild.LoggingChannel = channel.ID
|
||||||
|
err = services.GuildService.UpdateGuild(guild)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Logging Channel Updated.")
|
||||||
|
}
|
||||||
|
|
||||||
|
var GetLoggingChannelCommand = &disgoman.Command{
|
||||||
|
Name: "get-logging-channel",
|
||||||
|
Aliases: []string{"glc"},
|
||||||
|
Description: "Gets the channel logging messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: getLoggingChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func getLoggingChannelFunc(ctx disgoman.Context, _ []string) {
|
||||||
|
var channelID string
|
||||||
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", ctx.Guild.ID)
|
||||||
|
err := row.Scan(&channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error getting data from the database.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channelID == "" {
|
||||||
|
_, _ = ctx.Send("The logging channel is not set.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("The logging channel is currently %s", channel.Mention()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var SetWelcomeChannelCommand = &disgoman.Command{
|
||||||
|
Name: "set-welcome-channel",
|
||||||
|
Aliases: []string{"swc"},
|
||||||
|
Description: "Set the channel welcome messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: setWelcomeChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func setWelcomeChannelFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var idString string
|
||||||
|
if len(args) > 0 {
|
||||||
|
idString = args[0]
|
||||||
|
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
||||||
|
idString = idString[2 : len(idString)-1]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idString = ""
|
||||||
|
}
|
||||||
|
fmt.Println(idString)
|
||||||
|
if idString == "" {
|
||||||
|
_, err := postgres.DB.Exec("UPDATE guilds SET welcome_channel='' WHERE id=$1;", ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Welcomer Disabled.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.Channel(idString)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that channel.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channel.GuildID != ctx.Guild.ID {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "The channel passed is not in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("UPDATE guilds SET welcome_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Welcome Channel Updated.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var GetWelcomeChannelCommand = &disgoman.Command{
|
||||||
|
Name: "get-welcome-channel",
|
||||||
|
Aliases: []string{"gwc"},
|
||||||
|
Description: "Gets the channel welcome messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: getWelcomeChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWelcomeChannelFunc(ctx disgoman.Context, _ []string) {
|
||||||
|
var channelID string
|
||||||
|
row := postgres.DB.QueryRow("SELECT welcome_channel FROM guilds where id=$1", ctx.Guild.ID)
|
||||||
|
err := row.Scan(&channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error getting data from the database.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channelID == "" {
|
||||||
|
_, _ = ctx.Send("The welcomer is disabled.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("The welcome channel is currently %s", channel.Mention()))
|
||||||
|
}
|
||||||
|
|
||||||
|
var AddGuildCommand = &disgoman.Command{
|
||||||
|
Name: "addGuild",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Adds the current guild to the database",
|
||||||
|
OwnerOnly: true,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: addGuildCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func addGuildCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var guildID string
|
||||||
|
row := postgres.DB.QueryRow("SELECT id FROM guilds where id=$1", ctx.Guild.ID)
|
||||||
|
err := row.Scan(&guildID)
|
||||||
|
if err == nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "This guild is already in my database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = postgres.DB.Query("INSERT INTO guilds (id) VALUES ($1)", ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "There was a problem inserting this guild into the database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("This guild has been added.")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var SetPuzzleChannelCommand = &disgoman.Command{
|
||||||
|
Name: "set-puzzle-channel",
|
||||||
|
Aliases: []string{"spc"},
|
||||||
|
Description: "Set the channel puzzle messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: setPuzzleChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func setPuzzleChannelFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var idString string
|
||||||
|
if len(args) > 0 {
|
||||||
|
idString = args[0]
|
||||||
|
if strings.HasPrefix(idString, "<#") && strings.HasSuffix(idString, ">") {
|
||||||
|
idString = idString[2 : len(idString)-1]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idString = ""
|
||||||
|
}
|
||||||
|
fmt.Println(idString)
|
||||||
|
if idString == "" {
|
||||||
|
_, err := postgres.DB.Exec("UPDATE guilds SET puzzle_channel='' WHERE id=$1;", ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Puzzle Channel Updated.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.Channel(idString)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that channel.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channel.GuildID != ctx.Guild.ID {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "The channel passed is not in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("UPDATE guilds SET puzzle_channel=$1 WHERE id=$2;", idString, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Puzzle Channel Updated.")
|
||||||
|
}
|
||||||
|
|
||||||
|
var GetPuzzleChannelCommand = &disgoman.Command{
|
||||||
|
Name: "get-puzzle-channel",
|
||||||
|
Aliases: []string{"gpc"},
|
||||||
|
Description: "Gets the channel puzzle messages will be sent to.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: getPuzzleChannelFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPuzzleChannelFunc(ctx disgoman.Context, _ []string) {
|
||||||
|
var channelID string
|
||||||
|
row := postgres.DB.QueryRow("SELECT puzzle_channel FROM guilds where id=$1", ctx.Guild.ID)
|
||||||
|
err := row.Scan(&channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error getting data from the database.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if channelID == "" {
|
||||||
|
_, _ = ctx.Send("The puzzle channel is not set.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
channel, err := ctx.Session.State.GuildChannel(ctx.Guild.ID, channelID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "I got the channel ID but it does not appear to be a valid channel in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("The puzzle channel is currently %s", channel.Mention()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var SetPuzzleRoleCommand = &disgoman.Command{
|
||||||
|
Name: "set-puzzle-role",
|
||||||
|
Aliases: []string{"spr"},
|
||||||
|
Description: "Set the role to be pinged when there is a new puzzle",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: setPuzzleRoleFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func setPuzzleRoleFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var idString string
|
||||||
|
if len(args) > 0 {
|
||||||
|
idString = args[0]
|
||||||
|
if strings.HasPrefix(idString, "<@&") && strings.HasSuffix(idString, ">") {
|
||||||
|
idString = idString[3 : len(idString)-1]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
idString = ""
|
||||||
|
}
|
||||||
|
fmt.Println(idString)
|
||||||
|
if idString == "" {
|
||||||
|
_, err := postgres.DB.Exec("UPDATE guilds SET puzzle_role=NULL WHERE id=$1;", ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Puzzle Role Cleared.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
role, err := ctx.Session.State.Role(ctx.Guild.ID, idString)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id) VALUES ($1, $2) ON CONFLICT DO NOTHING", role.ID, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("UPDATE guilds SET puzzle_role=$1 WHERE id=$2;", role.ID, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send("Puzzle Role Updated.")
|
||||||
|
}
|
||||||
|
|
||||||
|
var GetPuzzleRoleCommand = &disgoman.Command{
|
||||||
|
Name: "get-puzzle-role",
|
||||||
|
Aliases: []string{"gpr"},
|
||||||
|
Description: "Get the role that will be pinged when there is a new puzzle",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: getPuzzleRoleFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPuzzleRoleFunc(ctx disgoman.Context, _ []string) {
|
||||||
|
var roleID sql.NullString
|
||||||
|
row := postgres.DB.QueryRow("SELECT puzzle_role FROM guilds where id=$1", ctx.Guild.ID)
|
||||||
|
err := row.Scan(&roleID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error getting data from the database.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !roleID.Valid {
|
||||||
|
_, _ = ctx.Send("The puzzle role is not set.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
role, err := ctx.Session.State.Role(ctx.Guild.ID, roleID.String)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "I got the role ID but it does not appear to be a valid role in this guild.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("The puzzle role is currently %s", role.Mention()))
|
||||||
|
return
|
||||||
|
}
|
||||||
@ -1,11 +1,11 @@
|
|||||||
package events
|
package guild_management
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
)
|
)
|
||||||
|
|
||||||
func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) {
|
func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) {
|
||||||
@ -19,7 +19,7 @@ func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var channelID string
|
var channelID string
|
||||||
row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID)
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID)
|
||||||
err := row.Scan(&channelID)
|
err := row.Scan(&channelID)
|
||||||
if err != nil || channelID == "" {
|
if err != nil || channelID == "" {
|
||||||
return
|
return
|
||||||
@ -56,7 +56,7 @@ func OnMessageDelete(session *discordgo.Session, m *discordgo.MessageDelete) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
var channelID string
|
var channelID string
|
||||||
row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID)
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", msg.GuildID)
|
||||||
err := row.Scan(&channelID)
|
err := row.Scan(&channelID)
|
||||||
if err != nil || channelID == "" {
|
if err != nil || channelID == "" {
|
||||||
return
|
return
|
||||||
56
internal/exts/init.go
Normal file
56
internal/exts/init.go
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package exts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/fun"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/guild_management"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/roles"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/tags"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/tasks"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/user_management"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/utils"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/p_interpreter"
|
||||||
|
)
|
||||||
|
|
||||||
|
func AddCommandHandlers(h *disgoman.CommandManager) {
|
||||||
|
// Arguments:
|
||||||
|
// name - command name - string
|
||||||
|
// desc - command description - string
|
||||||
|
// owneronly - only allow owners to run - bool
|
||||||
|
// hidden - hide command from non-owners - bool
|
||||||
|
// perms - permissisions required - anpan.Permission (int)
|
||||||
|
// type - command type, sets where the command is available
|
||||||
|
// run - function to run - func(anpan.Context, []string) / CommandRunFunc
|
||||||
|
_ = h.AddCommand(utils.UserCommand)
|
||||||
|
_ = h.AddCommand(utils.SayCommand)
|
||||||
|
_ = h.AddCommand(utils.GitCommand)
|
||||||
|
_ = h.AddCommand(utils.InviteCommand)
|
||||||
|
_ = h.AddCommand(utils.PingCommand)
|
||||||
|
_ = h.AddCommand(tasks.AddReminderCommand)
|
||||||
|
_ = h.AddCommand(tags.AddTagCommand)
|
||||||
|
_ = h.AddCommand(tags.TagCommand)
|
||||||
|
_ = h.AddCommand(roles.MakeRoleSelfAssignableCommand)
|
||||||
|
_ = h.AddCommand(roles.RemoveSelfAssignableCommand)
|
||||||
|
_ = h.AddCommand(roles.SelfAssignRoleCommand)
|
||||||
|
_ = h.AddCommand(roles.UnAssignRoleCommand)
|
||||||
|
_ = h.AddCommand(p_interpreter.PCommand)
|
||||||
|
_ = h.AddCommand(fun.InterleaveCommand)
|
||||||
|
_ = h.AddCommand(fun.DeinterleaveCommand)
|
||||||
|
_ = h.AddCommand(fun.GenerateRPNCommand)
|
||||||
|
_ = h.AddCommand(fun.ParseRPNCommand)
|
||||||
|
_ = h.AddCommand(fun.SolveCommand)
|
||||||
|
_ = h.AddCommand(user_management.KickUserCommand)
|
||||||
|
_ = h.AddCommand(user_management.BanUserCommand)
|
||||||
|
_ = h.AddCommand(user_management.UnbanUserCommand)
|
||||||
|
_ = h.AddCommand(guild_management.SetLoggingChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.GetLoggingChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.SetWelcomeChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.GetWelcomeChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.AddGuildCommand)
|
||||||
|
_ = h.AddCommand(guild_management.SetPuzzleChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.GetPuzzleChannelCommand)
|
||||||
|
_ = h.AddCommand(guild_management.SetPuzzleRoleCommand)
|
||||||
|
_ = h.AddCommand(guild_management.GetPuzzleRoleCommand)
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,8 +1,10 @@
|
|||||||
package utils
|
package logging
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
)
|
)
|
||||||
|
|
||||||
var LoggingChannel = make(chan *LogEvent, 10)
|
var LoggingChannel = make(chan *LogEvent, 10)
|
||||||
@ -19,7 +21,7 @@ type LogEvent struct {
|
|||||||
func LoggingHandler(lc chan *LogEvent) {
|
func LoggingHandler(lc chan *LogEvent) {
|
||||||
for event := range lc {
|
for event := range lc {
|
||||||
var channelID string
|
var channelID string
|
||||||
row := Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", event.GuildID)
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", event.GuildID)
|
||||||
err := row.Scan(&channelID)
|
err := row.Scan(&channelID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
@ -1,13 +1,24 @@
|
|||||||
package exts
|
package p_interpreter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
)
|
)
|
||||||
|
|
||||||
func pCommand(ctx disgoman.Context, args []string) {
|
var PCommand = &disgoman.Command{
|
||||||
|
Name: "P",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Interpret a P\" program and return the results",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: pCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func pCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
input := strings.Join(args, "")
|
input := strings.Join(args, "")
|
||||||
const LENGTH = 1999
|
const LENGTH = 1999
|
||||||
var mem [LENGTH]byte
|
var mem [LENGTH]byte
|
||||||
@ -57,7 +68,7 @@ func pCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: fmt.Sprintf("Invalid Character: %v", input[i]),
|
Message: fmt.Sprintf("Invalid Character: %v", input[i]),
|
||||||
Error: errors.New("invalid character"),
|
Error: errors.New("invalid character"),
|
||||||
@ -73,7 +84,7 @@ func pCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
_, err := ctx.Send(string(out))
|
_, err := ctx.Send(string(out))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't send results",
|
Message: "Couldn't send results",
|
||||||
Error: err,
|
Error: err,
|
||||||
389
internal/exts/roles/roles.go
Normal file
389
internal/exts/roles/roles.go
Normal file
@ -0,0 +1,389 @@
|
|||||||
|
package roles
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
|
"github.com/dustinpianalto/goff/internal/services"
|
||||||
|
)
|
||||||
|
|
||||||
|
var MakeRoleSelfAssignableCommand = &disgoman.Command{
|
||||||
|
Name: "make-role-self-assignable",
|
||||||
|
Aliases: []string{"makesar"},
|
||||||
|
Description: "Makes the passed in role self assignable by anyone",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: makeRoleSelfAssignableCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeRoleSelfAssignableCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var role *discordgo.Role
|
||||||
|
var err error
|
||||||
|
if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, true) ON CONFLICT (id) DO UPDATE SET self_assignable=true", role.ID, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("%s is now self assignable", role.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
var RemoveSelfAssignableCommand = &disgoman.Command{
|
||||||
|
Name: "remove-self-assignable-role",
|
||||||
|
Aliases: []string{"removesar"},
|
||||||
|
Description: "Makes a role that was previously self assignable not so",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: removeSelfAssignableRoleCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeSelfAssignableRoleCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var err error
|
||||||
|
var role *discordgo.Role
|
||||||
|
if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = postgres.DB.Exec("INSERT INTO roles (id, guild_id, self_assignable) VALUES ($1, $2, false) ON CONFLICT (id) DO UPDATE SET self_assignable=false", role.ID, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("%s's self assignability has been removed.", role.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
var SelfAssignRoleCommand = &disgoman.Command{
|
||||||
|
Name: "giverole",
|
||||||
|
Aliases: []string{"iwant", "givetome"},
|
||||||
|
Description: "Assigns a person the passed in role if it is self assignable",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: selfAssignRoleCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func selfAssignRoleCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var role *discordgo.Role
|
||||||
|
var err error
|
||||||
|
if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if memberHasRole(ctx.Member, role.ID) {
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("You already have the %s role silly...", role.Name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var selfAssignable bool
|
||||||
|
err = postgres.DB.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !selfAssignable {
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("You aren't allowed to assign yourself the %s role", role.Name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = ctx.Session.GuildMemberRoleAdd(ctx.Guild.ID, ctx.User.ID, role.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "There was a problem adding that role to you.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("Congratulations! The %s role has been added to your... Ummm... Thing.", role.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
var UnAssignRoleCommand = &disgoman.Command{
|
||||||
|
Name: "removerole",
|
||||||
|
Aliases: []string{"idon'twant"},
|
||||||
|
Description: "Removes a role from a person if the role is self assignable",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: unAssignRoleCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func unAssignRoleCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var role *discordgo.Role
|
||||||
|
var err error
|
||||||
|
if role, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !memberHasRole(ctx.Member, role.ID) {
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("I can't remove the %s role from you because you don't have it...", role.Name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var selfAssignable bool
|
||||||
|
err = postgres.DB.QueryRow("SELECT self_assignable FROM roles where id=$1", role.ID).Scan(&selfAssignable)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error Updating Database",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !selfAssignable {
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("You aren't allowed to remove the %s role from yourself", role.Name))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = ctx.Session.GuildMemberRoleRemove(ctx.Guild.ID, ctx.User.ID, role.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "There was a problem removing that role from you.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, _ = ctx.Send(fmt.Sprintf("Sad to see you go... but the %s role has been removed.", role.Name))
|
||||||
|
}
|
||||||
|
|
||||||
|
func memberHasRole(m *discordgo.Member, id string) bool {
|
||||||
|
for _, r := range m.Roles {
|
||||||
|
if r == id {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var MakeAutoRoleCommand = &disgoman.Command{
|
||||||
|
Name: "make-auto-role",
|
||||||
|
Aliases: []string{"makear"},
|
||||||
|
Description: "Marks the passed in role to auto add to new members.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: makeAutoRoleCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeAutoRoleCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var r *discordgo.Role
|
||||||
|
var err error
|
||||||
|
if r, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
role, err := services.RoleService.Role(r.ID)
|
||||||
|
if err != nil {
|
||||||
|
role = &goff.Role{
|
||||||
|
ID: r.ID,
|
||||||
|
IsModerator: false,
|
||||||
|
IsAdmin: false,
|
||||||
|
SelfAssignable: false,
|
||||||
|
AutoRole: true,
|
||||||
|
Guild: ctx.Guild.ID,
|
||||||
|
}
|
||||||
|
role, err = services.RoleService.AddRole(role)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error making an Auto Role",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = services.RoleService.MakeAutoRole(role)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error making an Auto Role",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var RemoveAutoRoleCommand = &disgoman.Command{
|
||||||
|
Name: "remove-auto-role",
|
||||||
|
Aliases: []string{"removear"},
|
||||||
|
Description: "Remove role from those added to new members.",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionManageServer,
|
||||||
|
Invoke: removeAutoRoleCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeAutoRoleCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
|
var roleString string
|
||||||
|
var roleID string
|
||||||
|
if len(args) > 0 {
|
||||||
|
roleString = strings.Join(args, " ")
|
||||||
|
if strings.HasPrefix(roleString, "<@&") && strings.HasSuffix(roleString, ">") {
|
||||||
|
roleID = roleString[3 : len(roleString)-1]
|
||||||
|
} else if _, err := strconv.Atoi(roleString); err == nil {
|
||||||
|
roleID = roleString
|
||||||
|
} else {
|
||||||
|
for _, role := range ctx.Guild.Roles {
|
||||||
|
if roleString == role.Name {
|
||||||
|
roleID = role.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(roleID)
|
||||||
|
var r *discordgo.Role
|
||||||
|
var err error
|
||||||
|
if r, err = ctx.Session.State.Role(ctx.Guild.ID, roleID); err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Can't find that Role.",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
role, err := services.RoleService.Role(r.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Role was not configured as an Auto Role",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
err = services.RoleService.RemoveAutoRole(role)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
|
Context: ctx,
|
||||||
|
Message: "Error removing Auto Role",
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package exts
|
package tags
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@ -6,63 +6,65 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
"github.com/dustinpianalto/disgoman"
|
||||||
"github.com/kballard/go-shellquote"
|
"github.com/dustinpianalto/goff"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
|
"github.com/dustinpianalto/goff/internal/services"
|
||||||
)
|
)
|
||||||
|
|
||||||
func addTagCommand(ctx disgoman.Context, input []string) {
|
var AddTagCommand = &disgoman.Command{
|
||||||
|
Name: "addtag",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Add a tag",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
SanitizeEveryone: true,
|
||||||
|
Invoke: addTagCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func addTagCommandFunc(ctx disgoman.Context, input []string) {
|
||||||
if len(input) >= 1 {
|
if len(input) >= 1 {
|
||||||
args, err := shellquote.Split(strings.Join(input, " "))
|
|
||||||
if err != nil {
|
|
||||||
if strings.Contains(err.Error(), "Unterminated") {
|
|
||||||
args = strings.SplitN(strings.Join(args, " "), " ", 2)
|
|
||||||
} else {
|
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
|
||||||
Context: ctx,
|
|
||||||
Message: "",
|
|
||||||
Error: err,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
queryString := `SELECT tags.id, tags.tag, tags.content from tags
|
queryString := `SELECT tags.id, tags.tag, tags.content from tags
|
||||||
WHERE tags.guild_id = $1
|
WHERE tags.guild_id = $1
|
||||||
AND tags.tag = $2;`
|
AND tags.tag = $2;`
|
||||||
row := utils.Database.QueryRow(queryString, ctx.Guild.ID, args[0])
|
row := postgres.DB.QueryRow(queryString, ctx.Guild.ID, input[0])
|
||||||
var dest string
|
var dest string
|
||||||
if err := row.Scan(&dest); err != nil {
|
if err := row.Scan(&dest); err != nil {
|
||||||
tag := args[0]
|
tag := input[0]
|
||||||
if tag == "" {
|
if tag == "" {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "That is not a valid tag name",
|
Message: "That is not a valid tag name",
|
||||||
Error: err,
|
Error: err,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if len(args) <= 1 {
|
if len(input) <= 1 {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "I got a name but no value",
|
Message: "I got a name but no value",
|
||||||
Error: err,
|
Error: err,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
value := args[1]
|
value := strings.Join(input[1:], " ")
|
||||||
if value == "" {
|
if value == "" {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "You have to include a content for the tag",
|
Message: "You have to include a content for the tag",
|
||||||
Error: err,
|
Error: err,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
queryString = `INSERT INTO tags (tag, content, creator, guild_id) VALUES ($1, $2, $3, $4);`
|
err = services.UserService.CreateUser(&goff.User{ID: ctx.User.ID}, ctx.Guild.ID)
|
||||||
_, err := utils.Database.Exec(queryString, tag, value, ctx.Message.Author.ID, ctx.Guild.ID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Send(err.Error())
|
log.Printf("Error creating user %s: %s", ctx.User.ID, err.Error())
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
}
|
||||||
|
queryString = `INSERT INTO tags (tag, content, creator, guild_id) VALUES ($1, $2, $3, $4);`
|
||||||
|
_, err := postgres.DB.Exec(queryString, tag, value, ctx.Message.Author.ID, ctx.Guild.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "",
|
Message: "",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -72,7 +74,7 @@ func addTagCommand(ctx disgoman.Context, input []string) {
|
|||||||
ctx.Send(fmt.Sprintf("Tag %v added successfully.", tag))
|
ctx.Send(fmt.Sprintf("Tag %v added successfully.", tag))
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "That tag already exists",
|
Message: "That tag already exists",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -81,7 +83,7 @@ func addTagCommand(ctx disgoman.Context, input []string) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ctx.Send("You need to tell me what tag you want to add...")
|
ctx.Send("You need to tell me what tag you want to add...")
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "You need to tell me what tag you want to add...",
|
Message: "You need to tell me what tag you want to add...",
|
||||||
Error: errors.New("nothing to do"),
|
Error: errors.New("nothing to do"),
|
||||||
@ -90,14 +92,24 @@ func addTagCommand(ctx disgoman.Context, input []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func tagCommand(ctx disgoman.Context, args []string) {
|
var TagCommand = &disgoman.Command{
|
||||||
|
Name: "tag",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Get a tag",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: tagCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func tagCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
if len(args) >= 1 {
|
if len(args) >= 1 {
|
||||||
tagString := strings.Join(args, " ")
|
tagString := strings.Join(args, " ")
|
||||||
queryString := `SELECT tags.id, tags.tag, tags.content from tags
|
queryString := `SELECT tags.id, tags.tag, tags.content from tags
|
||||||
WHERE tags.guild_id = $1;`
|
WHERE tags.guild_id = $1;`
|
||||||
rows, err := utils.Database.Query(queryString, ctx.Guild.ID)
|
rows, err := postgres.DB.Query(queryString, ctx.Guild.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "",
|
Message: "",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -111,14 +123,14 @@ func tagCommand(ctx disgoman.Context, args []string) {
|
|||||||
content string
|
content string
|
||||||
)
|
)
|
||||||
if err := rows.Scan(&id, &tag, &content); err != nil {
|
if err := rows.Scan(&id, &tag, &content); err != nil {
|
||||||
log.Fatal(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
if tagString == tag {
|
if tagString == tag {
|
||||||
ctx.Send(content)
|
ctx.Send(content)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: fmt.Sprintf("Tag %v not found", args[0]),
|
Message: fmt.Sprintf("Tag %v not found", args[0]),
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -127,7 +139,7 @@ func tagCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ctx.Send("I need a tag to fetch...")
|
ctx.Send("I need a tag to fetch...")
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "I need a tag to fetch...",
|
Message: "I need a tag to fetch...",
|
||||||
Error: errors.New("nothing to do"),
|
Error: errors.New("nothing to do"),
|
||||||
@ -1,10 +1,12 @@
|
|||||||
package utils
|
package tasks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bwmarrin/discordgo"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Task struct {
|
type Task struct {
|
||||||
@ -20,7 +22,7 @@ type Task struct {
|
|||||||
|
|
||||||
func processTask(task *Task, s *discordgo.Session) {
|
func processTask(task *Task, s *discordgo.Session) {
|
||||||
query := "SELECT completed, processing from tasks where id = $1"
|
query := "SELECT completed, processing from tasks where id = $1"
|
||||||
res, err := Database.Query(query, task.ID)
|
res, err := postgres.DB.Query(query, task.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
@ -38,8 +40,8 @@ func processTask(task *Task, s *discordgo.Session) {
|
|||||||
}
|
}
|
||||||
closeQuery := "Update tasks set completed = true where id = $1"
|
closeQuery := "Update tasks set completed = true where id = $1"
|
||||||
processQuery := "UPDATE tasks SET processing = true WHERE id = $1"
|
processQuery := "UPDATE tasks SET processing = true WHERE id = $1"
|
||||||
defer Database.Exec(closeQuery, task.ID)
|
defer postgres.DB.Exec(closeQuery, task.ID)
|
||||||
_, err = Database.Exec(processQuery, task.ID)
|
_, err = postgres.DB.Exec(processQuery, task.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
@ -85,7 +87,7 @@ func processTask(task *Task, s *discordgo.Session) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
processQuery = "UPDATE tasks SET processing = false WHERE id = $1"
|
processQuery = "UPDATE tasks SET processing = false WHERE id = $1"
|
||||||
_, err = Database.Exec(processQuery, task.ID)
|
_, err = postgres.DB.Exec(processQuery, task.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
@ -95,7 +97,7 @@ func processTask(task *Task, s *discordgo.Session) {
|
|||||||
func getTasksToRun() []Task {
|
func getTasksToRun() []Task {
|
||||||
query := "SELECT id, type, content, guild_id, channel_id, user_id, creation_time, trigger_time " +
|
query := "SELECT id, type, content, guild_id, channel_id, user_id, creation_time, trigger_time " +
|
||||||
"from tasks where completed is false and processing is false and trigger_time < $1"
|
"from tasks where completed is false and processing is false and trigger_time < $1"
|
||||||
res, err := Database.Query(query, time.Now())
|
res, err := postgres.DB.Query(query, time.Now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
@ -1,18 +1,29 @@
|
|||||||
package exts
|
package tasks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
"github.com/olebedev/when"
|
"github.com/olebedev/when"
|
||||||
"github.com/olebedev/when/rules/common"
|
"github.com/olebedev/when/rules/common"
|
||||||
"github.com/olebedev/when/rules/en"
|
"github.com/olebedev/when/rules/en"
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func addReminderCommand(ctx disgoman.Context, args []string) {
|
var AddReminderCommand = &disgoman.Command{
|
||||||
|
Name: "remind",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Remind me at a later time",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: addReminderFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func addReminderFunc(ctx disgoman.Context, args []string) {
|
||||||
w := when.New(nil)
|
w := when.New(nil)
|
||||||
w.Add(en.All...)
|
w.Add(en.All...)
|
||||||
w.Add(common.All...)
|
w.Add(common.All...)
|
||||||
@ -20,7 +31,7 @@ func addReminderCommand(ctx disgoman.Context, args []string) {
|
|||||||
text := strings.Join(args, " ")
|
text := strings.Join(args, " ")
|
||||||
r, err := w.Parse(text, time.Now())
|
r, err := w.Parse(text, time.Now())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Error parsing time",
|
Message: "Error parsing time",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -28,7 +39,7 @@ func addReminderCommand(ctx disgoman.Context, args []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if r == nil {
|
if r == nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "You need to include a valid time",
|
Message: "You need to include a valid time",
|
||||||
Error: errors.New("no time found"),
|
Error: errors.New("no time found"),
|
||||||
@ -38,9 +49,9 @@ func addReminderCommand(ctx disgoman.Context, args []string) {
|
|||||||
content := strings.Replace(text, r.Text+" ", "", 1)
|
content := strings.Replace(text, r.Text+" ", "", 1)
|
||||||
query := "INSERT INTO tasks (type, content, guild_id, channel_id, user_id, trigger_time) " +
|
query := "INSERT INTO tasks (type, content, guild_id, channel_id, user_id, trigger_time) " +
|
||||||
"VALUES ('Reminder', $1, $2, $3, $4, $5)"
|
"VALUES ('Reminder', $1, $2, $3, $4, $5)"
|
||||||
_, err = utils.Database.Exec(query, content, ctx.Guild.ID, ctx.Channel.ID, ctx.User.ID, r.Time)
|
_, err = postgres.DB.Exec(query, content, ctx.Guild.ID, ctx.Channel.ID, ctx.User.ID, r.Time)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Error adding task to database",
|
Message: "Error adding task to database",
|
||||||
Error: err,
|
Error: err,
|
||||||
89
internal/exts/user_management/member_join.go
Normal file
89
internal/exts/user_management/member_join.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package user_management
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
"github.com/dustinpianalto/goff/internal/services"
|
||||||
|
)
|
||||||
|
|
||||||
|
func OnGuildMemberAdd(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Println("Recovered from panic in OnGuildMemberAdd", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
user, err := services.UserService.User(member.User.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error getting user from database: ", err)
|
||||||
|
user = &goff.User{
|
||||||
|
ID: member.User.ID,
|
||||||
|
Banned: false,
|
||||||
|
Logging: true,
|
||||||
|
IsActive: true,
|
||||||
|
IsStaff: false,
|
||||||
|
IsAdmin: false,
|
||||||
|
}
|
||||||
|
err := services.UserService.CreateUser(user, member.GuildID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error adding user to database: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !user.IsActive {
|
||||||
|
user.IsActive = true
|
||||||
|
err = services.UserService.UpdateUser(user)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error marking user as active: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = services.UserService.AddUserToGuild(user, &goff.Guild{ID: member.GuildID})
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error adding user to guild: ", err)
|
||||||
|
}
|
||||||
|
roles, err := services.RoleService.GetAutoRoles(member.GuildID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error getting Auto Join Roles: ", err)
|
||||||
|
}
|
||||||
|
for _, r := range roles {
|
||||||
|
role, err := s.State.Role(member.GuildID, r.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error getting role: ", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err = s.GuildMemberRoleAdd(member.GuildID, member.User.ID, role.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error adding Role to member: ", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnGuildMemberRemove(s *discordgo.Session, member *discordgo.GuildMemberRemove) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Println("Recovered from panic in OnGuildMemberRemove: ", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
user, err := services.UserService.User(member.User.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error getting user from database: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = services.UserService.RemoveUserFromGuild(user, &goff.Guild{ID: member.GuildID})
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error removing user from guild: ", err)
|
||||||
|
}
|
||||||
|
for i, g := range user.Guilds {
|
||||||
|
if g == member.GuildID {
|
||||||
|
user.Guilds[len(user.Guilds)-1], user.Guilds[i] = user.Guilds[i], user.Guilds[len(user.Guilds)-1]
|
||||||
|
user.Guilds = user.Guilds[:len(user.Guilds)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(user.Guilds) == 0 {
|
||||||
|
err = services.UserService.MarkUserInactive(user)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Error marking user as inactive: ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,14 @@
|
|||||||
package events
|
package user_management
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bwmarrin/discordgo"
|
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff/internal/discord_utils"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
)
|
)
|
||||||
|
|
||||||
func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||||
@ -16,7 +18,7 @@ func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMember
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
var channelID string
|
var channelID string
|
||||||
row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID)
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID)
|
||||||
err := row.Scan(&channelID)
|
err := row.Scan(&channelID)
|
||||||
if err != nil || channelID == "" {
|
if err != nil || channelID == "" {
|
||||||
return
|
return
|
||||||
@ -39,11 +41,11 @@ func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMember
|
|||||||
}
|
}
|
||||||
|
|
||||||
int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64)
|
int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64)
|
||||||
snow := utils.ParseSnowflake(int64ID)
|
snow := discord_utils.ParseSnowflake(int64ID)
|
||||||
|
|
||||||
field := &discordgo.MessageEmbedField{
|
field := &discordgo.MessageEmbedField{
|
||||||
Name: "User was created:",
|
Name: "User was created:",
|
||||||
Value: utils.ParseDateString(snow.CreationTime),
|
Value: discord_utils.ParseDateString(snow.CreationTime),
|
||||||
Inline: false,
|
Inline: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +74,7 @@ func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMem
|
|||||||
}()
|
}()
|
||||||
timeNow := time.Now()
|
timeNow := time.Now()
|
||||||
var channelID string
|
var channelID string
|
||||||
row := utils.Database.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID)
|
row := postgres.DB.QueryRow("SELECT logging_channel FROM guilds where id=$1", member.GuildID)
|
||||||
err := row.Scan(&channelID)
|
err := row.Scan(&channelID)
|
||||||
if err != nil || channelID == "" {
|
if err != nil || channelID == "" {
|
||||||
return
|
return
|
||||||
@ -102,7 +104,7 @@ func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMem
|
|||||||
for _, log := range al.AuditLogEntries {
|
for _, log := range al.AuditLogEntries {
|
||||||
if log.TargetID == member.User.ID {
|
if log.TargetID == member.User.ID {
|
||||||
int64ID, _ := strconv.ParseInt(log.ID, 10, 64)
|
int64ID, _ := strconv.ParseInt(log.ID, 10, 64)
|
||||||
logSnow := utils.ParseSnowflake(int64ID)
|
logSnow := discord_utils.ParseSnowflake(int64ID)
|
||||||
if timeNow.Sub(logSnow.CreationTime).Seconds() <= 10 {
|
if timeNow.Sub(logSnow.CreationTime).Seconds() <= 10 {
|
||||||
user, err := s.User(log.UserID)
|
user, err := s.User(log.UserID)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -132,3 +134,34 @@ func OnGuildMemberRemoveLogging(s *discordgo.Session, member *discordgo.GuildMem
|
|||||||
}
|
}
|
||||||
s.ChannelMessageSendEmbed(channelID, embed)
|
s.ChannelMessageSendEmbed(channelID, embed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AddMemberToDatabase(s *discordgo.Session, m *discordgo.GuildMemberAdd) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Println("Recovered from panic in AddMemberToDatabase", r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
queryString := `INSERT INTO users (id, banned, logging, is_active, is_staff, is_admin)
|
||||||
|
VALUES ($1, false, false, true, false, false)`
|
||||||
|
_, err := postgres.DB.Exec(queryString, m.User.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(fmt.Errorf("error inserting %s into database: %w", m.User.ID, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("New User: %s\n", m.User.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MarkMemberInactive(s *discordgo.Session, m *discordgo.GuildMemberRemove) {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
log.Println("Recovered from panic in MarkMemberInactive")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
queryString := `UPDATE users SET is_active = false WHERE id = $1`
|
||||||
|
_, err := postgres.DB.Exec(queryString, m.User.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(fmt.Errorf("error marking %s as inactive: %w", m.User.ID, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println("User left: %s")
|
||||||
|
}
|
||||||
@ -1,16 +1,27 @@
|
|||||||
package exts
|
package user_management
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bwmarrin/discordgo"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/exts/logging"
|
||||||
)
|
)
|
||||||
|
|
||||||
func kickUserCommand(ctx disgoman.Context, args []string) {
|
var KickUserCommand = &disgoman.Command{
|
||||||
|
Name: "kick",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Kicks the given user with the given reason",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionKickMembers,
|
||||||
|
Invoke: kickUserFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func kickUserFunc(ctx disgoman.Context, args []string) {
|
||||||
var member *discordgo.Member
|
var member *discordgo.Member
|
||||||
var err error
|
var err error
|
||||||
if len(ctx.Message.Mentions) > 0 {
|
if len(ctx.Message.Mentions) > 0 {
|
||||||
@ -25,7 +36,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
err = errors.New("that is not a valid id")
|
err = errors.New("that is not a valid id")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't get that member",
|
Message: "Couldn't get that member",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -34,7 +45,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, member.User.ID); !higher {
|
if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, member.User.ID); !higher {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "You must have a higher role than the person you are trying to kick",
|
Message: "You must have a higher role than the person you are trying to kick",
|
||||||
Error: errors.New("need higher role"),
|
Error: errors.New("need higher role"),
|
||||||
@ -43,7 +54,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, member.User.ID); !higher {
|
if higher, _ := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, member.User.ID); !higher {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "I don't have a high enough role to kick that person",
|
Message: "I don't have a high enough role to kick that person",
|
||||||
Error: errors.New("need higher role"),
|
Error: errors.New("need higher role"),
|
||||||
@ -61,7 +72,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
err = ctx.Session.GuildMemberDeleteWithReason(ctx.Guild.ID, member.User.ID, auditReason)
|
err = ctx.Session.GuildMemberDeleteWithReason(ctx.Guild.ID, member.User.ID, auditReason)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: fmt.Sprintf("Something went wrong kicking %v", member.User.Username),
|
Message: fmt.Sprintf("Something went wrong kicking %v", member.User.Username),
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -69,7 +80,7 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
event := &utils.LogEvent{
|
event := &logging.LogEvent{
|
||||||
Embed: discordgo.MessageEmbed{
|
Embed: discordgo.MessageEmbed{
|
||||||
Title: "User Kicked",
|
Title: "User Kicked",
|
||||||
Description: fmt.Sprintf(
|
Description: fmt.Sprintf(
|
||||||
@ -84,11 +95,21 @@ func kickUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
GuildID: ctx.Guild.ID,
|
GuildID: ctx.Guild.ID,
|
||||||
Session: ctx.Session,
|
Session: ctx.Session,
|
||||||
}
|
}
|
||||||
utils.LoggingChannel <- event
|
logging.LoggingChannel <- event
|
||||||
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been kicked.", member.User.Username, member.User.Discriminator))
|
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been kicked.", member.User.Username, member.User.Discriminator))
|
||||||
}
|
}
|
||||||
|
|
||||||
func banUserCommand(ctx disgoman.Context, args []string) {
|
var BanUserCommand = &disgoman.Command{
|
||||||
|
Name: "ban",
|
||||||
|
Aliases: []string{"ban-no-delete"},
|
||||||
|
Description: "Bans the given user with the given reason",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionBanMembers,
|
||||||
|
Invoke: banUserFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func banUserFunc(ctx disgoman.Context, args []string) {
|
||||||
var user *discordgo.User
|
var user *discordgo.User
|
||||||
var err error
|
var err error
|
||||||
if len(ctx.Message.Mentions) > 0 {
|
if len(ctx.Message.Mentions) > 0 {
|
||||||
@ -103,7 +124,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
err = errors.New("that is not a valid id")
|
err = errors.New("that is not a valid id")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't get that user",
|
Message: "Couldn't get that user",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -113,7 +134,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
|
|
||||||
if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, user.ID); err != nil {
|
if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Message.Author.ID, user.ID); err != nil {
|
||||||
if err.Error() == "can't find caller member" {
|
if err.Error() == "can't find caller member" {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Who are you?",
|
Message: "Who are you?",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -121,7 +142,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if !higher {
|
} else if !higher {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "You must have a higher role than the person you are trying to ban",
|
Message: "You must have a higher role than the person you are trying to ban",
|
||||||
Error: errors.New("need higher role"),
|
Error: errors.New("need higher role"),
|
||||||
@ -131,7 +152,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
|
|
||||||
if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, user.ID); err != nil {
|
if higher, err := disgoman.HasHigherRole(ctx.Session, ctx.Guild.ID, ctx.Session.State.User.ID, user.ID); err != nil {
|
||||||
if err.Error() == "can't find caller member" {
|
if err.Error() == "can't find caller member" {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Who am I?",
|
Message: "Who am I?",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -139,7 +160,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if !higher {
|
} else if !higher {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "I don't have a high enough role to ban that person",
|
Message: "I don't have a high enough role to ban that person",
|
||||||
Error: errors.New("need higher role"),
|
Error: errors.New("need higher role"),
|
||||||
@ -161,7 +182,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
err = ctx.Session.GuildBanCreateWithReason(ctx.Guild.ID, user.ID, auditReason, days)
|
err = ctx.Session.GuildBanCreateWithReason(ctx.Guild.ID, user.ID, auditReason, days)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: fmt.Sprintf("Something went wrong banning %v", user.Username),
|
Message: fmt.Sprintf("Something went wrong banning %v", user.Username),
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -169,7 +190,7 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
event := &utils.LogEvent{
|
event := &logging.LogEvent{
|
||||||
Embed: discordgo.MessageEmbed{
|
Embed: discordgo.MessageEmbed{
|
||||||
Title: "User Banned",
|
Title: "User Banned",
|
||||||
Description: fmt.Sprintf(
|
Description: fmt.Sprintf(
|
||||||
@ -184,11 +205,21 @@ func banUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
GuildID: ctx.Guild.ID,
|
GuildID: ctx.Guild.ID,
|
||||||
Session: ctx.Session,
|
Session: ctx.Session,
|
||||||
}
|
}
|
||||||
utils.LoggingChannel <- event
|
logging.LoggingChannel <- event
|
||||||
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been banned.", user.Username, user.Discriminator))
|
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been banned.", user.Username, user.Discriminator))
|
||||||
}
|
}
|
||||||
|
|
||||||
func unbanUserCommand(ctx disgoman.Context, args []string) {
|
var UnbanUserCommand = &disgoman.Command{
|
||||||
|
Name: "unban",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Unbans the given user",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: disgoman.PermissionBanMembers,
|
||||||
|
Invoke: unbanUserFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func unbanUserFunc(ctx disgoman.Context, args []string) {
|
||||||
var user *discordgo.User
|
var user *discordgo.User
|
||||||
var err error
|
var err error
|
||||||
if len(ctx.Message.Mentions) > 0 {
|
if len(ctx.Message.Mentions) > 0 {
|
||||||
@ -203,7 +234,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
err = errors.New("that is not a valid id")
|
err = errors.New("that is not a valid id")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't get that user",
|
Message: "Couldn't get that user",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -213,7 +244,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
|
|
||||||
bans, err := ctx.Session.GuildBans(ctx.Guild.ID)
|
bans, err := ctx.Session.GuildBans(ctx.Guild.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Error processing current bans",
|
Message: "Error processing current bans",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -224,14 +255,14 @@ func unbanUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
if ban.User.ID == user.ID {
|
if ban.User.ID == user.ID {
|
||||||
err = ctx.Session.GuildBanDelete(ctx.Guild.ID, user.ID)
|
err = ctx.Session.GuildBanDelete(ctx.Guild.ID, user.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: fmt.Sprintf("Something went wrong unbanning %v", user.Username),
|
Message: fmt.Sprintf("Something went wrong unbanning %v", user.Username),
|
||||||
Error: err,
|
Error: err,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
event := &utils.LogEvent{
|
event := &logging.LogEvent{
|
||||||
Embed: discordgo.MessageEmbed{
|
Embed: discordgo.MessageEmbed{
|
||||||
Title: "User Banned",
|
Title: "User Banned",
|
||||||
Description: fmt.Sprintf(
|
Description: fmt.Sprintf(
|
||||||
@ -246,7 +277,7 @@ func unbanUserCommand(ctx disgoman.Context, args []string) {
|
|||||||
GuildID: ctx.Guild.ID,
|
GuildID: ctx.Guild.ID,
|
||||||
Session: ctx.Session,
|
Session: ctx.Session,
|
||||||
}
|
}
|
||||||
utils.LoggingChannel <- event
|
logging.LoggingChannel <- event
|
||||||
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been unbanned.", user.Username, user.Discriminator))
|
_, _ = ctx.Send(fmt.Sprintf("User %v#%v has been unbanned.", user.Username, user.Discriminator))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1,23 +1,34 @@
|
|||||||
package exts
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"djpianalto.com/goff/djpianalto.com/goff/utils"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bwmarrin/discordgo"
|
|
||||||
"github.com/dustinpianalto/disgoman"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/disgoman"
|
||||||
|
"github.com/dustinpianalto/goff/internal/discord_utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func pingCommand(ctx disgoman.Context, _ []string) {
|
var PingCommand = &disgoman.Command{
|
||||||
|
Name: "ping",
|
||||||
|
Aliases: []string{" "},
|
||||||
|
Description: "Check the bot's ping",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: pingCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func pingCommandFunc(ctx disgoman.Context, _ []string) {
|
||||||
timeBefore := time.Now()
|
timeBefore := time.Now()
|
||||||
msg, _ := ctx.Send("Pong!")
|
msg, _ := ctx.Send("Pong!")
|
||||||
took := time.Now().Sub(timeBefore)
|
took := time.Now().Sub(timeBefore)
|
||||||
_, err := ctx.Session.ChannelMessageEdit(ctx.Message.ChannelID, msg.ID, fmt.Sprintf("Pong!\nPing Took **%s**", took.String()))
|
_, err := ctx.Session.ChannelMessageEdit(ctx.Message.ChannelID, msg.ID, fmt.Sprintf("Pong!\nPing Took **%s**", took.String()))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Ping Failed",
|
Message: "Ping Failed",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -25,7 +36,17 @@ func pingCommand(ctx disgoman.Context, _ []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func inviteCommand(ctx disgoman.Context, args []string) {
|
var InviteCommand = &disgoman.Command{
|
||||||
|
Name: "invite",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Get the invite link for this bot or others",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: inviteCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func inviteCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
var ids []string
|
var ids []string
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
ids = []string{ctx.Session.State.User.ID}
|
ids = []string{ctx.Session.State.User.ID}
|
||||||
@ -38,7 +59,7 @@ func inviteCommand(ctx disgoman.Context, args []string) {
|
|||||||
url := fmt.Sprintf("<https://discordapp.com/oauth2/authorize?client_id=%v&scope=bot>", id)
|
url := fmt.Sprintf("<https://discordapp.com/oauth2/authorize?client_id=%v&scope=bot>", id)
|
||||||
_, err := ctx.Send(url)
|
_, err := ctx.Send(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't send the invite link.",
|
Message: "Couldn't send the invite link.",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -47,7 +68,17 @@ func inviteCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func gitCommand(ctx disgoman.Context, _ []string) {
|
var GitCommand = &disgoman.Command{
|
||||||
|
Name: "git",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Show my github link",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: gitCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func gitCommandFunc(ctx disgoman.Context, _ []string) {
|
||||||
embed := &discordgo.MessageEmbed{
|
embed := &discordgo.MessageEmbed{
|
||||||
Title: "Hi there, My code is on Github",
|
Title: "Hi there, My code is on Github",
|
||||||
Color: 0,
|
Color: 0,
|
||||||
@ -55,7 +86,7 @@ func gitCommand(ctx disgoman.Context, _ []string) {
|
|||||||
}
|
}
|
||||||
_, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
_, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Git failed",
|
Message: "Git failed",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -63,13 +94,24 @@ func gitCommand(ctx disgoman.Context, _ []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sayCommand(ctx disgoman.Context, args []string) {
|
var SayCommand = &disgoman.Command{
|
||||||
|
Name: "say",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Repeat a message",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
SanitizeEveryone: true,
|
||||||
|
Invoke: sayCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func sayCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
resp := strings.Join(args, " ")
|
resp := strings.Join(args, " ")
|
||||||
resp = strings.ReplaceAll(resp, "@everyone", "@\ufff0everyone")
|
resp = strings.ReplaceAll(resp, "@everyone", "@\ufff0everyone")
|
||||||
resp = strings.ReplaceAll(resp, "@here", "@\ufff0here")
|
resp = strings.ReplaceAll(resp, "@here", "@\ufff0here")
|
||||||
_, err := ctx.Session.ChannelMessageSend(ctx.Message.ChannelID, resp)
|
_, err := ctx.Session.ChannelMessageSend(ctx.Message.ChannelID, resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Say Failed",
|
Message: "Say Failed",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -77,7 +119,17 @@ func sayCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func userCommand(ctx disgoman.Context, args []string) {
|
var UserCommand = &disgoman.Command{
|
||||||
|
Name: "user",
|
||||||
|
Aliases: nil,
|
||||||
|
Description: "Get user info",
|
||||||
|
OwnerOnly: false,
|
||||||
|
Hidden: false,
|
||||||
|
RequiredPermissions: 0,
|
||||||
|
Invoke: userCommandFunc,
|
||||||
|
}
|
||||||
|
|
||||||
|
func userCommandFunc(ctx disgoman.Context, args []string) {
|
||||||
var member *discordgo.Member
|
var member *discordgo.Member
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
member, _ = ctx.Session.GuildMember(ctx.Guild.ID, ctx.Message.Author.ID)
|
member, _ = ctx.Session.GuildMember(ctx.Guild.ID, ctx.Message.Author.ID)
|
||||||
@ -89,7 +141,7 @@ func userCommand(ctx disgoman.Context, args []string) {
|
|||||||
member, err = ctx.Session.GuildMember(ctx.Guild.ID, args[0])
|
member, err = ctx.Session.GuildMember(ctx.Guild.ID, args[0])
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't get that member",
|
Message: "Couldn't get that member",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -134,15 +186,15 @@ func userCommand(ctx disgoman.Context, args []string) {
|
|||||||
guildJoinTime, _ := member.JoinedAt.Parse()
|
guildJoinTime, _ := member.JoinedAt.Parse()
|
||||||
guildJoinedField := &discordgo.MessageEmbedField{
|
guildJoinedField := &discordgo.MessageEmbedField{
|
||||||
Name: "Joined Guild:",
|
Name: "Joined Guild:",
|
||||||
Value: utils.ParseDateString(guildJoinTime),
|
Value: discord_utils.ParseDateString(guildJoinTime),
|
||||||
Inline: false,
|
Inline: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64)
|
int64ID, _ := strconv.ParseInt(member.User.ID, 10, 64)
|
||||||
s := utils.ParseSnowflake(int64ID)
|
s := discord_utils.ParseSnowflake(int64ID)
|
||||||
discordJoinedField := &discordgo.MessageEmbedField{
|
discordJoinedField := &discordgo.MessageEmbedField{
|
||||||
Name: "Joined Discord:",
|
Name: "Joined Discord:",
|
||||||
Value: utils.ParseDateString(s.CreationTime),
|
Value: discord_utils.ParseDateString(s.CreationTime),
|
||||||
Inline: false,
|
Inline: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,7 +211,7 @@ func userCommand(ctx disgoman.Context, args []string) {
|
|||||||
}
|
}
|
||||||
_, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
_, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ErrorChannel <- disgoman.CommandError{
|
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||||
Context: ctx,
|
Context: ctx,
|
||||||
Message: "Couldn't send the user embed",
|
Message: "Couldn't send the user embed",
|
||||||
Error: err,
|
Error: err,
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package postgres
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Database *sql.DB
|
DB *sql.DB
|
||||||
)
|
)
|
||||||
|
|
||||||
func ConnectDatabase(dbConnString string) {
|
func ConnectDatabase(dbConnString string) {
|
||||||
@ -19,11 +19,14 @@ func ConnectDatabase(dbConnString string) {
|
|||||||
} else {
|
} else {
|
||||||
fmt.Println("Database Connected.")
|
fmt.Println("Database Connected.")
|
||||||
}
|
}
|
||||||
Database = db
|
db.SetMaxOpenConns(75) // The RDS instance has a max of 75 open connections
|
||||||
|
db.SetMaxIdleConns(5)
|
||||||
|
db.SetConnMaxLifetime(300)
|
||||||
|
DB = db
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitializeDatabase() {
|
func InitializeDatabase() {
|
||||||
_, err := Database.Query("CREATE TABLE IF NOT EXISTS users(" +
|
_, err := DB.Query("CREATE TABLE IF NOT EXISTS users(" +
|
||||||
"id varchar(30) primary key," +
|
"id varchar(30) primary key," +
|
||||||
"banned bool not null default false," +
|
"banned bool not null default false," +
|
||||||
"logging bool not null default true," +
|
"logging bool not null default true," +
|
||||||
@ -35,7 +38,7 @@ func InitializeDatabase() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS guilds(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS guilds(" +
|
||||||
"id varchar(30) primary key," +
|
"id varchar(30) primary key," +
|
||||||
"welcome_message varchar(1000) NOT NULL DEFAULT ''," +
|
"welcome_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||||
"goodbye_message varchar(1000) NOT NULL DEFAULT ''," +
|
"goodbye_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||||
@ -45,14 +48,14 @@ func InitializeDatabase() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS prefixes(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS prefixes(" +
|
||||||
"id serial primary key," +
|
"id serial primary key," +
|
||||||
"prefix varchar(10) not null unique default 'Go.'" +
|
"prefix varchar(10) not null unique default 'Go.'" +
|
||||||
")")
|
")")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS tags(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tags(" +
|
||||||
"id serial primary key," +
|
"id serial primary key," +
|
||||||
"tag varchar(100) not null unique," +
|
"tag varchar(100) not null unique," +
|
||||||
"content varchar(1000) not null," +
|
"content varchar(1000) not null," +
|
||||||
@ -63,21 +66,21 @@ func InitializeDatabase() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS x_users_guilds(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS x_users_guilds(" +
|
||||||
"guild_id varchar(30) not null references guilds(id)," +
|
"guild_id varchar(30) not null references guilds(id)," +
|
||||||
"user_id varchar(30) not null references users(id)" +
|
"user_id varchar(30) not null references users(id)" +
|
||||||
")")
|
")")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS x_guilds_prefixes(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS x_guilds_prefixes(" +
|
||||||
"guild_id varchar(30) not null references guilds(id)," +
|
"guild_id varchar(30) not null references guilds(id)," +
|
||||||
"prefix_id int not null references prefixes(id)" +
|
"prefix_id int not null references prefixes(id)" +
|
||||||
")")
|
")")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("CREATE TABLE IF NOT EXISTS tasks(" +
|
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tasks(" +
|
||||||
"id serial primary key," +
|
"id serial primary key," +
|
||||||
"type varchar(10) not null," +
|
"type varchar(10) not null," +
|
||||||
"content text not null," +
|
"content text not null," +
|
||||||
@ -91,14 +94,14 @@ func InitializeDatabase() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query(`CREATE TABLE IF NOT EXISTS postfixes(
|
_, err = DB.Query(`CREATE TABLE IF NOT EXISTS postfixes(
|
||||||
id serial primary key,
|
id serial primary key,
|
||||||
name varchar(100) not null,
|
name varchar(100) not null,
|
||||||
time timestamp not null default NOW())`)
|
time timestamp not null default NOW())`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Exec(`CREATE TABLE IF NOT EXISTS puzzles(
|
_, err = DB.Exec(`CREATE TABLE IF NOT EXISTS puzzles(
|
||||||
id serial primary key,
|
id serial primary key,
|
||||||
text text not null,
|
text text not null,
|
||||||
time timestamp not null
|
time timestamp not null
|
||||||
@ -106,7 +109,7 @@ func InitializeDatabase() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Exec(`CREATE TABLE IF NOT EXISTS x_guilds_puzzles(
|
_, err = DB.Exec(`CREATE TABLE IF NOT EXISTS x_guilds_puzzles(
|
||||||
id serial primary key,
|
id serial primary key,
|
||||||
guild_id varchar(30) not null references guilds(id),
|
guild_id varchar(30) not null references guilds(id),
|
||||||
puzzle_id int not null references puzzles(id),
|
puzzle_id int not null references puzzles(id),
|
||||||
@ -116,37 +119,37 @@ func InitializeDatabase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func LoadTestData() {
|
func LoadTestData() {
|
||||||
_, err := Database.Query("INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin) values " +
|
_, err := DB.Query("INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin) values " +
|
||||||
"('351794468870946827', false, true, '76561198024193239', true, true, true)," +
|
"('351794468870946827', false, true, '76561198024193239', true, true, true)," +
|
||||||
"('692908139506434065', false, true, '', true, false, false)," +
|
"('692908139506434065', false, true, '', true, false, false)," +
|
||||||
"('396588996706304010', false, true, '', true, true, false)")
|
"('396588996706304010', false, true, '', true, true, false)")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("INSERT INTO guilds (id, welcome_message, goodbye_message) VALUES " +
|
_, err = DB.Query("INSERT INTO guilds (id, welcome_message, goodbye_message) VALUES " +
|
||||||
"('265828729970753537', 'Hey there is someone new here.', 'Well fine then... Just leave without saying goodbye')")
|
"('265828729970753537', 'Hey there is someone new here.', 'Well fine then... Just leave without saying goodbye')")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("INSERT INTO prefixes (prefix) VALUES ('Godev.'), ('godev.'), ('godev,')")
|
_, err = DB.Query("INSERT INTO prefixes (prefix) VALUES ('Godev.'), ('godev.'), ('godev,')")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("INSERT INTO x_users_guilds (guild_id, user_id) VALUES " +
|
_, err = DB.Query("INSERT INTO x_users_guilds (guild_id, user_id) VALUES " +
|
||||||
"('265828729970753537', '351794468870946827')," +
|
"('265828729970753537', '351794468870946827')," +
|
||||||
"('265828729970753537', '692908139506434065')," +
|
"('265828729970753537', '692908139506434065')," +
|
||||||
"('265828729970753537', '396588996706304010')")
|
"('265828729970753537', '396588996706304010')")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("INSERT INTO x_guilds_prefixes (guild_id, prefix_id) VALUES " +
|
_, err = DB.Query("INSERT INTO x_guilds_prefixes (guild_id, prefix_id) VALUES " +
|
||||||
"('265828729970753537', 1)," +
|
"('265828729970753537', 1)," +
|
||||||
"('265828729970753537', 2)," +
|
"('265828729970753537', 2)," +
|
||||||
"('265828729970753537', 3)")
|
"('265828729970753537', 3)")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
_, err = Database.Query("INSERT INTO tags (tag, content, creator, guild_id) VALUES " +
|
_, err = DB.Query("INSERT INTO tags (tag, content, creator, guild_id) VALUES " +
|
||||||
"('test', 'This is a test of the tag system', '351794468870946827', '265828729970753537')")
|
"('test', 'This is a test of the tag system', '351794468870946827', '265828729970753537')")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
127
internal/postgres/guild.go
Normal file
127
internal/postgres/guild.go
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
package postgres
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GuildService struct {
|
||||||
|
DB *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GuildService) Guild(id string) (*goff.Guild, error) {
|
||||||
|
var g goff.Guild
|
||||||
|
queryString := `SELECT id, welcome_message, goodbye_message,
|
||||||
|
logging_channel, welcome_channel, puzzle_channel, puzzle_role
|
||||||
|
FROM guilds
|
||||||
|
WHERE id = $1`
|
||||||
|
row := s.DB.QueryRow(queryString, id)
|
||||||
|
err := row.Scan(
|
||||||
|
&g.ID,
|
||||||
|
&g.WelcomeMessage,
|
||||||
|
&g.GoodbyeMessage,
|
||||||
|
&g.LoggingChannel,
|
||||||
|
&g.WelcomeChannel,
|
||||||
|
&g.PuzzleChannel,
|
||||||
|
&g.PuzzleRole,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var prefixes []string
|
||||||
|
queryString = `SELECT p.prefix
|
||||||
|
FROM prefixes p, x_guilds_prefixes xgp
|
||||||
|
WHERE p.id = xgp.prefix_id AND xgp.guild_id = $1`
|
||||||
|
rows, err := s.DB.Query(queryString, id)
|
||||||
|
if err == nil {
|
||||||
|
for rows.Next() {
|
||||||
|
var prefix string
|
||||||
|
err = rows.Scan(&prefix)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
prefixes = append(prefixes, prefix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.Prefixes = prefixes
|
||||||
|
return &g, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GuildService) CreateGuild(g *goff.Guild) error {
|
||||||
|
queryString := `INSERT INTO guilds (id,
|
||||||
|
welcome_message,
|
||||||
|
goodbye_message,
|
||||||
|
logging_channel,
|
||||||
|
welcome_channel,
|
||||||
|
puzzle_channel,
|
||||||
|
puzzle_role)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6, $7)`
|
||||||
|
_, err := s.DB.Exec(queryString,
|
||||||
|
g.ID,
|
||||||
|
g.WelcomeMessage,
|
||||||
|
g.GoodbyeMessage,
|
||||||
|
g.LoggingChannel,
|
||||||
|
g.WelcomeChannel,
|
||||||
|
g.PuzzleChannel,
|
||||||
|
g.PuzzleRole,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GuildService) DeleteGuild(g *goff.Guild) error {
|
||||||
|
queryString := `DELETE CASCADE FROM guilds WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, g.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GuildService) GuildUsers(g *goff.Guild) ([]*goff.User, error) {
|
||||||
|
var users []*goff.User
|
||||||
|
queryString := `SELECT u.id, u.banned, u.logging, u.steam_id, u.is_active, u.is_staff, u.is_admin
|
||||||
|
FROM users u, x_users_guilds xug
|
||||||
|
WHERE xug.guild_id = $1
|
||||||
|
AND xug.user_id = u.id`
|
||||||
|
rows, err := s.DB.Query(queryString, g.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var user goff.User
|
||||||
|
err := rows.Scan(&user.ID,
|
||||||
|
&user.Banned,
|
||||||
|
&user.Logging,
|
||||||
|
&user.SteamID,
|
||||||
|
&user.IsActive,
|
||||||
|
&user.IsStaff,
|
||||||
|
&user.IsAdmin,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
users = append(users, &user)
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GuildService) UpdateGuild(g *goff.Guild) error {
|
||||||
|
queryString := `UPDATE guilds SET
|
||||||
|
welcome_message = $1,
|
||||||
|
goodbye_message = $2,
|
||||||
|
logging_channel = $3,
|
||||||
|
welcome_channel = $4,
|
||||||
|
puzzle_channel = $5,
|
||||||
|
puzzle_role = $6
|
||||||
|
WHERE id = $7`
|
||||||
|
_, err := s.DB.Exec(queryString,
|
||||||
|
g.WelcomeMessage,
|
||||||
|
g.GoodbyeMessage,
|
||||||
|
g.LoggingChannel,
|
||||||
|
g.WelcomeChannel,
|
||||||
|
g.PuzzleChannel,
|
||||||
|
g.PuzzleRole,
|
||||||
|
g.ID,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
185
internal/postgres/postfixes.go
Normal file
185
internal/postgres/postfixes.go
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
package postgres
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
type postfix struct {
|
||||||
|
Name string
|
||||||
|
Invoke func(bool) error
|
||||||
|
}
|
||||||
|
|
||||||
|
var postfixes = []postfix{
|
||||||
|
postfix{
|
||||||
|
Name: "1_Update_Guild_for_Puzzle",
|
||||||
|
Invoke: updateGuildForPuzzle,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "1_Update_X_Guild_Prefixes_to_add_ID",
|
||||||
|
Invoke: updateXGuildPrefixesToAddID,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "1_Update_Tags_Content_Length",
|
||||||
|
Invoke: updateTagsContentLength,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "2_Add_Table_Roles",
|
||||||
|
Invoke: addTableRoles,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "3_Update_Guild_Add_Puzzle_Role",
|
||||||
|
Invoke: updateGuildsAddPuzzleRole,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "4_Add_Multi_Column_Unique_XUsersGuilds",
|
||||||
|
Invoke: addMultiColumnUniqueXUsersGuilds,
|
||||||
|
},
|
||||||
|
postfix{
|
||||||
|
Name: "5_Add_Auto_Role_To_Roles_Table",
|
||||||
|
Invoke: addAutoRoleToRoles,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func RunPostfixes() {
|
||||||
|
for _, postfix := range postfixes {
|
||||||
|
queryString := "SELECT * from postfixes where name = $1"
|
||||||
|
rows, err := DB.Query(queryString, postfix.Name)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if rows.Next() {
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
err := postfix.Invoke(false)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
_, err = DB.Exec("INSERT INTO postfixes (name) VALUES ($1)", postfix.Name)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateGuildForPuzzle(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE guilds
|
||||||
|
ADD COLUMN puzzle_channel varchar(30) not null default ''`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE guilds
|
||||||
|
DROP COLUMN puzzleChat`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateXGuildPrefixesToAddID(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE x_guilds_prefixes
|
||||||
|
ADD COLUMN id serial primary key`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE x_guilds_prefixes
|
||||||
|
DROP COLUMN id`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateTagsContentLength(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE tags
|
||||||
|
ALTER COLUMN content TYPE varchar(2000)`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE tags
|
||||||
|
ALTER COLUMN content TYPE varchar(1000)`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addTableRoles(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `CREATE TABLE roles(
|
||||||
|
id varchar(30) primary key,
|
||||||
|
guild_id varchar(30) not null references guilds(id),
|
||||||
|
self_assignable bool not null default false,
|
||||||
|
admin bool not null default false,
|
||||||
|
moderator bool not null default false
|
||||||
|
)`
|
||||||
|
} else {
|
||||||
|
queryString = `DROP TABLE roles`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateGuildsAddPuzzleRole(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE guilds
|
||||||
|
ADD COLUMN puzzle_role varchar(30) references roles(id)`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE guilds
|
||||||
|
DROP COLUMN puzzle_role`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addMultiColumnUniqueXUsersGuilds(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE x_users_guilds
|
||||||
|
ADD CONSTRAINT u_user_guild UNIQUE(user_id, guild_id)`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE DROP CONSTRAINT u_user_guild IF EXISTS`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addAutoRoleToRoles(revert bool) error {
|
||||||
|
var queryString string
|
||||||
|
if !revert {
|
||||||
|
queryString = `ALTER TABLE roles
|
||||||
|
ADD COLUMN auto_role bool DEFAULT false`
|
||||||
|
} else {
|
||||||
|
queryString = `ALTER TABLE roles
|
||||||
|
DROP COLUMN auto_role`
|
||||||
|
}
|
||||||
|
_, err := DB.Exec(queryString)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
86
internal/postgres/roles.go
Normal file
86
internal/postgres/roles.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package postgres
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RoleService struct {
|
||||||
|
DB *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) Role(id string) (*goff.Role, error) {
|
||||||
|
var r goff.Role
|
||||||
|
queryString := `SELECT id, moderator, admin, self_assignable, guild_id FROM roles WHERE id = $1`
|
||||||
|
row := s.DB.QueryRow(queryString, id)
|
||||||
|
if err := row.Scan(&r.ID, &r.IsModerator, &r.IsAdmin, &r.SelfAssignable, &r.Guild); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) AddRole(r *goff.Role) (*goff.Role, error) {
|
||||||
|
queryString := `INSERT INTO roles (id, moderator, admin, self_assignable, auto_role, guild)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT DO NOTHING`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID, r.IsModerator, r.IsAdmin, r.SelfAssignable, r.AutoRole, r.Guild)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return r, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) DeleteRole(r *goff.Role) error {
|
||||||
|
queryString := `DELETE FROM roles WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) MakeSelfAssignable(r *goff.Role) error {
|
||||||
|
queryString := `UPDATE roles SET self_assignable = true WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) RemoveSelfAssignable(r *goff.Role) error {
|
||||||
|
queryString := `UPDATE roles SET self_assignable = false WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) MakeAutoRole(r *goff.Role) error {
|
||||||
|
queryString := `UPDATE roles SET auto_role = true WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) RemoveAutoRole(r *goff.Role) error {
|
||||||
|
queryString := `UPDATE roles SET auto_role = false WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, r.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoleService) GetAutoRoles(gID string) ([]*goff.Role, error) {
|
||||||
|
var roles []*goff.Role
|
||||||
|
queryString := `SELECT id FROM roles WHERE guild_id = $1`
|
||||||
|
rows, err := s.DB.Query(queryString, gID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var id string
|
||||||
|
err := rows.Scan(&id)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
role, err := s.Role(id)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
roles = append(roles, role)
|
||||||
|
}
|
||||||
|
return roles, nil
|
||||||
|
}
|
||||||
87
internal/postgres/user.go
Normal file
87
internal/postgres/user.go
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
package postgres
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UserService struct {
|
||||||
|
DB *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) User(id string) (*goff.User, error) {
|
||||||
|
var u goff.User
|
||||||
|
queryString := `SELECT id, banned, logging, steam_id, is_active, is_staff, is_admin
|
||||||
|
FROM users WHERE id=$1`
|
||||||
|
row := s.DB.QueryRow(queryString, id)
|
||||||
|
if err := row.Scan(&u.ID, &u.Banned, &u.Logging, &u.SteamID, &u.IsActive, &u.IsStaff, &u.IsAdmin); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var guilds []string
|
||||||
|
queryString = `SELECT guild_id from x_users_guilds WHERE user_id=$1`
|
||||||
|
rows, err := s.DB.Query(queryString, id)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
for rows.Next() {
|
||||||
|
var guildID string
|
||||||
|
err = rows.Scan(&guildID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
guilds = append(guilds, guildID)
|
||||||
|
}
|
||||||
|
u.Guilds = guilds
|
||||||
|
return &u, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) CreateUser(u *goff.User, gid string) error {
|
||||||
|
queryString := `INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT DO NOTHING`
|
||||||
|
_, err := s.DB.Exec(queryString, u.ID, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin)
|
||||||
|
if err == nil {
|
||||||
|
err = s.AddUserToGuild(u, &goff.Guild{ID: gid})
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) DeleteUser(u *goff.User) error {
|
||||||
|
queryString := `DELETE CASCADE FROM x_users_guilds WHERE user_id = $1; DELETE FROM users WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, u.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) MarkUserInactive(u *goff.User) error {
|
||||||
|
queryString := `UPDATE users SET is_active = false WHERE id = $1`
|
||||||
|
_, err := s.DB.Exec(queryString, u.ID)
|
||||||
|
if err == nil {
|
||||||
|
u.IsActive = false
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) AddUserToGuild(u *goff.User, g *goff.Guild) error {
|
||||||
|
queryString := `INSERT INTO x_users_guilds (user_id, guild_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`
|
||||||
|
_, err := s.DB.Exec(queryString, u.ID, g.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) RemoveUserFromGuild(u *goff.User, g *goff.Guild) error {
|
||||||
|
queryString := `DELETE FROM x_users_guilds WHERE user_id = $1 AND guild_id = $2`
|
||||||
|
_, err := s.DB.Exec(queryString, u.ID, g.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *UserService) UpdateUser(u *goff.User) error {
|
||||||
|
queryString := `UPDATE users SET
|
||||||
|
banned = $1,
|
||||||
|
logging = $2,
|
||||||
|
steam_id = $3,
|
||||||
|
is_active = $4,
|
||||||
|
is_staff = $5,
|
||||||
|
is_admin = $6
|
||||||
|
WHERE id = $7`
|
||||||
|
_, err := s.DB.Exec(queryString, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin)
|
||||||
|
return err
|
||||||
|
}
|
||||||
13
internal/services/services.go
Normal file
13
internal/services/services.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package services
|
||||||
|
|
||||||
|
import "github.com/dustinpianalto/goff"
|
||||||
|
|
||||||
|
var UserService goff.UserService
|
||||||
|
var GuildService goff.GuildService
|
||||||
|
var RoleService goff.RoleService
|
||||||
|
|
||||||
|
func InitalizeServices(us goff.UserService, gs goff.GuildService, rs goff.RoleService) {
|
||||||
|
UserService = us
|
||||||
|
GuildService = gs
|
||||||
|
RoleService = rs
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package email
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
@ -9,6 +9,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff/pkg/puzzles"
|
||||||
imap "github.com/emersion/go-imap"
|
imap "github.com/emersion/go-imap"
|
||||||
"github.com/emersion/go-imap/client"
|
"github.com/emersion/go-imap/client"
|
||||||
"github.com/emersion/go-message/mail"
|
"github.com/emersion/go-message/mail"
|
||||||
@ -117,7 +118,7 @@ func processEmail(r io.Reader, dg *discordgo.Session, wg *sync.WaitGroup) {
|
|||||||
if addressIn(from, puzzleAddress) &&
|
if addressIn(from, puzzleAddress) &&
|
||||||
strings.Contains(subject, "Daily Coding Problem:") {
|
strings.Contains(subject, "Daily Coding Problem:") {
|
||||||
log.Println("Processing Puzzle")
|
log.Println("Processing Puzzle")
|
||||||
ProcessPuzzleEmail(mr, dg)
|
puzzles.ProcessPuzzleEmail(mr, dg)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package puzzles
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
@ -8,6 +8,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/dustinpianalto/goff"
|
||||||
|
"github.com/dustinpianalto/goff/internal/postgres"
|
||||||
"github.com/emersion/go-message/mail"
|
"github.com/emersion/go-message/mail"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -48,15 +50,15 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) {
|
|||||||
Text: "Daily Coding Problem",
|
Text: "Daily Coding Problem",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var guilds []Guild
|
var guilds []goff.Guild
|
||||||
queryString := `SELECT id, puzzle_channel from guilds`
|
queryString := `SELECT id, puzzle_channel, puzzle_role from guilds`
|
||||||
rows, err := Database.Query(queryString)
|
rows, err := postgres.DB.Query(queryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var guild Guild
|
var guild goff.Guild
|
||||||
err := rows.Scan(&guild.ID, &guild.PuzzleChannel)
|
err := rows.Scan(&guild.ID, &guild.PuzzleChannel, &guild.PuzzleRole)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
continue
|
continue
|
||||||
@ -65,7 +67,7 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) {
|
|||||||
}
|
}
|
||||||
var puzzleID int64
|
var puzzleID int64
|
||||||
queryString = "INSERT INTO puzzles (text, time) VALUES ($1, $2) RETURNING id"
|
queryString = "INSERT INTO puzzles (text, time) VALUES ($1, $2) RETURNING id"
|
||||||
err = Database.QueryRow(queryString, puzzle, date).Scan(&puzzleID)
|
err = postgres.DB.QueryRow(queryString, puzzle, date).Scan(&puzzleID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
return
|
return
|
||||||
@ -74,15 +76,24 @@ func ProcessPuzzleEmail(mr *mail.Reader, dg *discordgo.Session) {
|
|||||||
if g.PuzzleChannel == "" {
|
if g.PuzzleChannel == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
msg := discordgo.MessageSend{
|
var msg discordgo.MessageSend
|
||||||
Embed: &e,
|
role, err := dg.State.Role(g.ID, g.PuzzleRole.String)
|
||||||
|
if err != nil {
|
||||||
|
msg = discordgo.MessageSend{
|
||||||
|
Embed: &e,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msg = discordgo.MessageSend{
|
||||||
|
Content: role.Mention(),
|
||||||
|
Embed: &e,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m, err := dg.ChannelMessageSendComplex(g.PuzzleChannel, &msg)
|
m, err := dg.ChannelMessageSendComplex(g.PuzzleChannel, &msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
}
|
}
|
||||||
queryString = "INSERT INTO x_guilds_puzzles (guild_id, puzzle_id, message_id) VALUES ($1, $2, $3)"
|
queryString = "INSERT INTO x_guilds_puzzles (guild_id, puzzle_id, message_id) VALUES ($1, $2, $3)"
|
||||||
_, err = Database.Exec(queryString, g.ID, puzzleID, m.ID)
|
_, err = postgres.DB.Exec(queryString, g.ID, puzzleID, m.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
continue
|
continue
|
||||||
21
role.go
Normal file
21
role.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package goff
|
||||||
|
|
||||||
|
type Role struct {
|
||||||
|
ID string
|
||||||
|
IsModerator bool
|
||||||
|
IsAdmin bool
|
||||||
|
SelfAssignable bool
|
||||||
|
AutoRole bool
|
||||||
|
Guild string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RoleService interface {
|
||||||
|
Role(id string) (*Role, error)
|
||||||
|
AddRole(r *Role) (*Role, error)
|
||||||
|
DeleteRole(r *Role) error
|
||||||
|
MakeSelfAssignable(r *Role) error
|
||||||
|
RemoveSelfAssignable(r *Role) error
|
||||||
|
MakeAutoRole(r *Role) error
|
||||||
|
RemoveAutoRole(r *Role) error
|
||||||
|
GetAutoRoles(gID string) ([]*Role, error)
|
||||||
|
}
|
||||||
134
task-definition.json
Normal file
134
task-definition.json
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
{
|
||||||
|
"ipcMode": null,
|
||||||
|
"executionRoleArn": "arn:aws:iam::005692590034:role/goff_ecs_rds+cw+ecr",
|
||||||
|
"containerDefinitions": [
|
||||||
|
{
|
||||||
|
"dnsSearchDomains": null,
|
||||||
|
"environmentFiles": null,
|
||||||
|
"logConfiguration": {
|
||||||
|
"logDriver": "awslogs",
|
||||||
|
"secretOptions": null,
|
||||||
|
"options": {
|
||||||
|
"awslogs-group": "/ecs/goff",
|
||||||
|
"awslogs-region": "us-east-1",
|
||||||
|
"awslogs-stream-prefix": "ecs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"entryPoint": null,
|
||||||
|
"portMappings": [],
|
||||||
|
"command": null,
|
||||||
|
"linuxParameters": null,
|
||||||
|
"cpu": 0,
|
||||||
|
"environment": [],
|
||||||
|
"resourceRequirements": null,
|
||||||
|
"ulimits": null,
|
||||||
|
"dnsServers": null,
|
||||||
|
"mountPoints": [],
|
||||||
|
"workingDirectory": null,
|
||||||
|
"secrets": [
|
||||||
|
{
|
||||||
|
"valueFrom": "goff_database_uri",
|
||||||
|
"name": "DATABASE_URL"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueFrom": "goff_discord_token",
|
||||||
|
"name": "DISCORDGO_TOKEN"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueFrom": "goff_email_password",
|
||||||
|
"name": "GOFF_EMAIL_PASSWORD"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueFrom": "goff_email_username",
|
||||||
|
"name": "GOFF_EMAIL_USERNAME"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dockerSecurityOptions": null,
|
||||||
|
"memory": 512,
|
||||||
|
"memoryReservation": null,
|
||||||
|
"volumesFrom": [],
|
||||||
|
"stopTimeout": null,
|
||||||
|
"image": "005692590034.dkr.ecr.us-east-1.amazonaws.com/goff:latest",
|
||||||
|
"startTimeout": null,
|
||||||
|
"firelensConfiguration": null,
|
||||||
|
"dependsOn": null,
|
||||||
|
"disableNetworking": null,
|
||||||
|
"interactive": null,
|
||||||
|
"healthCheck": null,
|
||||||
|
"essential": true,
|
||||||
|
"links": null,
|
||||||
|
"hostname": null,
|
||||||
|
"extraHosts": null,
|
||||||
|
"pseudoTerminal": null,
|
||||||
|
"user": null,
|
||||||
|
"readonlyRootFilesystem": null,
|
||||||
|
"dockerLabels": null,
|
||||||
|
"systemControls": null,
|
||||||
|
"privileged": null,
|
||||||
|
"name": "goff"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"placementConstraints": [],
|
||||||
|
"memory": "512",
|
||||||
|
"taskRoleArn": "arn:aws:iam::005692590034:role/goff_ecs_rds+cw+ecr",
|
||||||
|
"compatibilities": [
|
||||||
|
"EC2"
|
||||||
|
],
|
||||||
|
"taskDefinitionArn": "arn:aws:ecs:us-east-1:005692590034:task-definition/goff:2",
|
||||||
|
"family": "goff",
|
||||||
|
"requiresAttributes": [
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "ecs.capability.execution-role-awslogs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "com.amazonaws.ecs.capability.ecr-auth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "com.amazonaws.ecs.capability.task-iam-role"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "ecs.capability.execution-role-ecr-pull"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targetId": null,
|
||||||
|
"targetType": null,
|
||||||
|
"value": null,
|
||||||
|
"name": "ecs.capability.secrets.ssm.environment-variables"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pidMode": null,
|
||||||
|
"requiresCompatibilities": [
|
||||||
|
"EC2"
|
||||||
|
],
|
||||||
|
"networkMode": null,
|
||||||
|
"cpu": "1024",
|
||||||
|
"revision": 2,
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"inferenceAccelerators": null,
|
||||||
|
"proxyConfiguration": null,
|
||||||
|
"volumes": []
|
||||||
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
/usr/local/bin/docker-compose build || exit
|
|
||||||
/usr/local/bin/docker-compose up -d
|
|
||||||
22
user.go
Normal file
22
user.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package goff
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
ID string
|
||||||
|
Banned bool
|
||||||
|
Logging bool
|
||||||
|
SteamID string
|
||||||
|
IsActive bool
|
||||||
|
IsStaff bool
|
||||||
|
IsAdmin bool
|
||||||
|
Guilds []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserService interface {
|
||||||
|
User(id string) (*User, error)
|
||||||
|
CreateUser(u *User, gid string) error
|
||||||
|
DeleteUser(u *User) error
|
||||||
|
MarkUserInactive(u *User) error
|
||||||
|
AddUserToGuild(u *User, g *Guild) error
|
||||||
|
RemoveUserFromGuild(u *User, g *Guild) error
|
||||||
|
UpdateUser(u *User) error
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user