Compare commits
31
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13f80a6972 | ||
|
|
cadef92efb | ||
|
|
a93139fcf2 | ||
|
|
05d4096766 | ||
|
|
6a33cceebb | ||
|
|
5cd626a5a4 | ||
|
|
e2f25eaab4 | ||
|
|
ea058baff5 | ||
|
|
d9e1efbaf0 | ||
|
|
af506f828d | ||
|
|
5c42616a3a | ||
|
|
6cc5e042d5 | ||
|
|
4db28f5c0b | ||
|
|
fb4d7977aa | ||
|
|
30394b35e5 | ||
|
|
87961c5081 | ||
|
|
562ec6acaf | ||
|
|
3169953f3f | ||
|
|
d119425236 | ||
|
|
ce1bbbc445 | ||
|
|
f4ec8a7a49 | ||
|
|
bec52ad5a5 | ||
|
|
5411730a96 | ||
|
|
187f9816ca | ||
|
|
feab8e661c | ||
|
|
96b63a4e83 | ||
|
|
fcddca2226 | ||
|
|
28d78bdb8c | ||
|
|
35882993c2 | ||
|
|
85bcb31d56 | ||
|
|
23c0434ed3 |
@@ -1,5 +0,0 @@
|
||||
# Service release contract
|
||||
|
||||
Butler resolves this repository's protected source revision to verified immutable images. The platform updates only image references in the existing production Compose file and restarts only the already running application services. It preserves current environment, storage, routes, and provider configuration. It retains previous application images and restores them if readiness fails.
|
||||
|
||||
Migration and maintenance images are pinned when declared, but this release operation does not run database migrations or maintenance jobs. A release requiring a schema change needs the corresponding explicit platform migration first. No homelab image-pin commit is required for an ordinary compatible application release.
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"deployment": "goff-release",
|
||||
"environment": "production",
|
||||
"images": {
|
||||
"goff_release_goff_image": {
|
||||
"name": "goff",
|
||||
"tag": "sha-{revision}"
|
||||
}
|
||||
},
|
||||
"revision_variable": "goff_release_revision"
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
.git
|
||||
.github
|
||||
.gitea
|
||||
.env
|
||||
.idea
|
||||
goff
|
||||
@@ -1,158 +0,0 @@
|
||||
name: Build and Push Container
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
tags:
|
||||
- v*
|
||||
workflow_dispatch: null
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number
|
||||
|| github.run_id }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: butler-ci
|
||||
env:
|
||||
REGISTRY: gitea.wayfinderak.com
|
||||
IMAGE_NAME: gitea.wayfinderak.com/wayfinderak/goff
|
||||
container:
|
||||
options: --dns 172.16.30.10
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: https://github.com/actions/checkout@v4
|
||||
|
||||
- name: Select relevant delivery work
|
||||
id: delivery
|
||||
env:
|
||||
DELIVERY_EVENT: ${{ github.event_name }}
|
||||
DELIVERY_REF: ${{ github.ref }}
|
||||
DELIVERY_SHA: ${{ github.sha }}
|
||||
DELIVERY_BASE: ${{ github.event.pull_request.base.sha || github.event.before }}
|
||||
run: |
|
||||
cd .
|
||||
bash scripts/ci-select.sh
|
||||
- name: Install Go and Docker CLI if needed
|
||||
if: ${{ steps.delivery.outputs.run == 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
need_apt=0
|
||||
need_apk=0
|
||||
if ! command -v go >/dev/null 2>&1 || ! command -v docker >/dev/null 2>&1; then
|
||||
if command -v apt-get >/dev/null 2>&1; then
|
||||
need_apt=1
|
||||
elif command -v apk >/dev/null 2>&1; then
|
||||
need_apk=1
|
||||
else
|
||||
echo "No supported package manager found" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$need_apt" -eq 1 ]; then
|
||||
apt-get update
|
||||
if ! command -v go >/dev/null 2>&1; then
|
||||
apt-get install -y golang-go
|
||||
fi
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
apt-get install -y docker.io curl dnsutils iputils-ping
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$need_apk" -eq 1 ]; then
|
||||
if ! command -v go >/dev/null 2>&1; then
|
||||
apk add --no-cache go
|
||||
fi
|
||||
if ! command -v docker >/dev/null 2>&1; then
|
||||
apk add --no-cache docker-cli curl bind-tools iputils
|
||||
fi
|
||||
fi
|
||||
|
||||
go version
|
||||
docker version
|
||||
|
||||
- name: Run tests
|
||||
if: ${{ steps.delivery.outputs.run == 'true' }}
|
||||
run: go test ./...
|
||||
|
||||
- name: Log in to Gitea Container Registry
|
||||
if: ${{ (steps.delivery.outputs.run == 'true') && github.event_name != 'pull_request' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
for attempt in 1 2 3; do
|
||||
echo "docker login attempt $attempt"
|
||||
if echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login "$REGISTRY" -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin; then
|
||||
exit 0
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
echo "docker login failed after 3 attempts" >&2
|
||||
exit 1
|
||||
|
||||
- name: Determine image tags
|
||||
if: ${{ steps.delivery.outputs.run == 'true' }}
|
||||
id: meta
|
||||
shell: bash
|
||||
env:
|
||||
REF: ${{ gitea.ref }}
|
||||
REF_NAME: ${{ gitea.ref_name }}
|
||||
SHA: ${{ gitea.sha }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
tags=("$IMAGE_NAME:sha-$SHA")
|
||||
|
||||
if [[ "$REF" == refs/tags/* ]]; then
|
||||
version="$REF_NAME"
|
||||
tags+=("$IMAGE_NAME:$version")
|
||||
tags+=("$IMAGE_NAME:latest")
|
||||
else
|
||||
branch="$REF_NAME"
|
||||
branch_safe="$(echo "$branch" | tr '/_' '--')"
|
||||
sha_short="$(echo "$SHA" | cut -c1-7)"
|
||||
tags+=("$IMAGE_NAME:$branch_safe")
|
||||
tags+=("$IMAGE_NAME:$branch_safe-$sha_short")
|
||||
if [[ "$branch" == "main" || "$branch" == "master" ]]; then
|
||||
tags+=("$IMAGE_NAME:latest")
|
||||
fi
|
||||
fi
|
||||
|
||||
printf 'tags<<EOF\n' >> "$GITHUB_OUTPUT"
|
||||
printf '%s\n' "${tags[@]}" >> "$GITHUB_OUTPUT"
|
||||
printf 'EOF\n' >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Build image
|
||||
if: ${{ steps.delivery.outputs.run == 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mapfile -t tags <<'EOF'
|
||||
${{ steps.meta.outputs.tags }}
|
||||
EOF
|
||||
|
||||
build_args=()
|
||||
for tag in "${tags[@]}"; do
|
||||
build_args+=(--tag "$tag")
|
||||
done
|
||||
|
||||
docker build --label "org.opencontainers.image.revision=$GITHUB_SHA" "${build_args[@]}" .
|
||||
|
||||
- name: Push image
|
||||
if: ${{ (steps.delivery.outputs.run == 'true') && github.event_name != 'pull_request' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
while IFS= read -r tag; do
|
||||
[ -n "$tag" ] || continue
|
||||
docker push "$tag"
|
||||
done <<'EOF'
|
||||
${{ steps.meta.outputs.tags }}
|
||||
EOF
|
||||
+50
-52
@@ -1,64 +1,62 @@
|
||||
name: Build and Push Container
|
||||
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:
|
||||
branches:
|
||||
- master
|
||||
- main
|
||||
tags:
|
||||
- v*
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
REGISTRY: gitea.wayfinderak.com
|
||||
IMAGE_NAME: wayfinderak/goff
|
||||
tags:
|
||||
- v[0-9]+.[0-9]+.[0-9]+
|
||||
- v[0-9]+.[0-9]+.[0-9]+-[a-zA-Z]+
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to Gitea registry
|
||||
uses: docker/login-action@v3
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Configure AWS credentials
|
||||
uses: aws-actions/configure-aws-credentials@v1
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
aws-region: us-east-1
|
||||
|
||||
- name: Prepare image tags
|
||||
id: prep
|
||||
shell: bash
|
||||
- name: Login to Amazon ECR
|
||||
id: login-ecr
|
||||
uses: aws-actions/amazon-ecr-login@v1
|
||||
|
||||
- name: Get Version
|
||||
id: get_version
|
||||
uses: battila7/get-version-action@v2.0.0
|
||||
|
||||
- name: Build, tag, and push image to Amazon ECR
|
||||
id: build-image
|
||||
env:
|
||||
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
|
||||
ECR_REPOSITORY: goff
|
||||
IMAGE_TAG: ${{ steps.get_version.outputs.version-without-v }}
|
||||
run: |
|
||||
short_sha="${GITHUB_SHA::7}"
|
||||
tags="${REGISTRY}/${IMAGE_NAME}:sha-${short_sha}"
|
||||
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
|
||||
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
|
||||
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
|
||||
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
|
||||
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
|
||||
|
||||
if [[ "${GITHUB_REF_TYPE}" == "branch" && ("${GITHUB_REF_NAME}" == "master" || "${GITHUB_REF_NAME}" == "main") ]]; then
|
||||
tags+=$'\n'"${REGISTRY}/${IMAGE_NAME}:latest"
|
||||
fi
|
||||
|
||||
if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
|
||||
version="${GITHUB_REF_NAME#v}"
|
||||
tags+=$'\n'"${REGISTRY}/${IMAGE_NAME}:${version}"
|
||||
fi
|
||||
|
||||
{
|
||||
echo 'tags<<EOF'
|
||||
echo "$tags"
|
||||
echo 'EOF'
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Build and push image
|
||||
uses: docker/build-push-action@v6
|
||||
- name: Fill in the new image ID in the Amazon ECS task definition
|
||||
id: task-def
|
||||
uses: aws-actions/amazon-ecs-render-task-definition@v1
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
task-definition: task-definition.json
|
||||
container-name: "goff"
|
||||
image: ${{ steps.build-image.outputs.image }}
|
||||
|
||||
- name: Deploy Amazon ECS task definition
|
||||
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
|
||||
with:
|
||||
task-definition: ${{ steps.task-def.outputs.task-definition }}
|
||||
service: "goff"
|
||||
cluster: "discord-bots"
|
||||
wait-for-service-stability: true
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
.env
|
||||
.idea
|
||||
|
||||
portainer-app.env
|
||||
|
||||
+12
-10
@@ -1,18 +1,20 @@
|
||||
FROM golang:1.22-alpine AS builder
|
||||
FROM golang:1.14-alpine as dev
|
||||
|
||||
WORKDIR /src
|
||||
RUN apk add --no-cache ca-certificates git tzdata
|
||||
WORKDIR /go/src/Goff
|
||||
COPY ./go.mod .
|
||||
COPY ./go.sum .
|
||||
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
COPY . .
|
||||
ARG TARGETARCH=amd64
|
||||
RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -o /out/goff ./cmd/goff
|
||||
RUN go install github.com/dustinpianalto/goff/...
|
||||
|
||||
FROM alpine:3.20
|
||||
RUN apk add --no-cache ca-certificates tzdata
|
||||
CMD [ "go", "run", "cmd/goff/main.go"]
|
||||
|
||||
COPY --from=builder /out/goff /usr/local/bin/goff
|
||||
from alpine
|
||||
|
||||
ENTRYPOINT ["/usr/local/bin/goff"]
|
||||
WORKDIR /bin
|
||||
|
||||
COPY --from=dev /go/bin/goff ./goff
|
||||
|
||||
CMD [ "goff" ]
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
# Portainer deployment notes
|
||||
|
||||
Generated from the current Kubernetes deployment in namespace `discord-bots`. Secret values are in the local `portainer-*.env` files.
|
||||
|
||||
## Kubernetes source
|
||||
|
||||
- Deployment: `goff`
|
||||
- Replicas: `1`
|
||||
- Rolling update: maxSurge `1`, maxUnavailable `1`
|
||||
- minReadySeconds: `120`
|
||||
- Labels/selectors: `app=goff`
|
||||
- Image pull secrets: `none required for Portainer stack`
|
||||
|
||||
## Containers
|
||||
|
||||
- `pgbouncer`: image `timoha/pgbouncer:1.15.0`; env: DATABASE_URL, SERVER_TLS_SSLMODE, AUTH_TYPE; ports: 5432; requests: {'cpu': '500m', 'memory': '256Mi'}; limits: {'cpu': '1', 'memory': '512Mi'}
|
||||
- `goff`: image `gitea.wayfinderak.com/wayfinderak/goff:latest`; env: DATABASE_URL, DISCORDGO_TOKEN, GOFF_EMAIL_USERNAME, GOFF_EMAIL_PASSWORD; ports: none; requests: {'cpu': '1', 'memory': '512Mi'}; limits: {'cpu': '2', 'memory': '1Gi'}
|
||||
|
||||
## Portainer files
|
||||
|
||||
- `portainer-stack.yml` - Docker Compose stack to paste/use in Portainer.
|
||||
- `portainer-app.env` - bot runtime secrets/env.
|
||||
|
||||
## Portainer database connection
|
||||
|
||||
This Portainer stack does not include pgbouncer. `DATABASE_URL` in `portainer-app.env` points directly at the external PostgreSQL service copied from the Kubernetes pgbouncer upstream URL.
|
||||
Regular → Executable
+9
-14
@@ -4,15 +4,15 @@ import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/guild_management"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/logging"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/tasks"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/user_management"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/services"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/pkg/email"
|
||||
"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"
|
||||
"os"
|
||||
@@ -51,7 +51,6 @@ func main() {
|
||||
|
||||
us := &postgres.UserService{DB: postgres.DB}
|
||||
gs := &postgres.GuildService{DB: postgres.DB}
|
||||
rs := &postgres.RoleService{DB: postgres.DB}
|
||||
|
||||
//prefixes := []string{
|
||||
// "Go.",
|
||||
@@ -72,7 +71,7 @@ func main() {
|
||||
|
||||
// Add Command Handlers
|
||||
exts.AddCommandHandlers(&manager)
|
||||
services.InitalizeServices(us, gs, rs)
|
||||
services.InitalizeServices(us, gs)
|
||||
|
||||
//if _, ok := handler.Commands["help"]; !ok {
|
||||
// handler.AddDefaultHelpCommand()
|
||||
@@ -83,10 +82,7 @@ func main() {
|
||||
dg.AddHandler(guild_management.OnMessageUpdate)
|
||||
dg.AddHandler(guild_management.OnMessageDelete)
|
||||
dg.AddHandler(user_management.OnGuildMemberAddLogging)
|
||||
dg.AddHandler(user_management.OnGuildMemberAdd)
|
||||
dg.AddHandler(user_management.OnGuildMemberRemoveLogging)
|
||||
dg.AddHandler(user_management.OnGuildMemberRemove)
|
||||
dg.AddHandler(user_management.OnGuildMemberUpdate)
|
||||
|
||||
err = dg.Open()
|
||||
if err != nil {
|
||||
@@ -124,7 +120,6 @@ func getPrefixes(guildID string) []string {
|
||||
log.Println(err)
|
||||
return []string{"Go.", "go."}
|
||||
}
|
||||
defer rows.Close()
|
||||
var prefixes []string
|
||||
for rows.Next() {
|
||||
var prefix string
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: goff
|
||||
namespace: discord-bots
|
||||
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: pgbouncer
|
||||
image: timoha/pgbouncer:1.15.0
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "0.5"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "1"
|
||||
env:
|
||||
- name: DATABASE_URL
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: goff
|
||||
key: pgbouncer_url
|
||||
- name: SERVER_TLS_SSLMODE
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: goff
|
||||
key: pgbouncer_ssl
|
||||
- name: AUTH_TYPE
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: goff
|
||||
key: pgbouncer_auth
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
- name: goff
|
||||
image: <IMAGE>
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "1"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "2"
|
||||
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
|
||||
imagePullSecrets:
|
||||
- name: registry-1
|
||||
@@ -1,10 +0,0 @@
|
||||
services:
|
||||
goff:
|
||||
image: ${IMAGE:-gitea.wayfinderak.com/wayfinderak/goff:${IMAGE_TAG:-latest}}
|
||||
container_name: goff
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
DISCORDGO_TOKEN: ${DISCORDGO_TOKEN}
|
||||
GOFF_EMAIL_USERNAME: ${GOFF_EMAIL_USERNAME}
|
||||
GOFF_EMAIL_PASSWORD: ${GOFF_EMAIL_PASSWORD}
|
||||
@@ -1,20 +1,14 @@
|
||||
module gitea.wayfinderak.com/wayfinderak/goff
|
||||
module github.com/dustinpianalto/goff
|
||||
|
||||
go 1.14
|
||||
|
||||
require (
|
||||
github.com/AlekSi/pointer v1.1.0 // indirect
|
||||
github.com/bwmarrin/discordgo v0.23.2
|
||||
github.com/dustinpianalto/disgoman v0.0.21
|
||||
github.com/bwmarrin/discordgo v0.22.0
|
||||
github.com/dustinpianalto/disgoman v0.0.15
|
||||
github.com/dustinpianalto/rpnparse v1.0.1
|
||||
github.com/emersion/go-imap v1.1.0
|
||||
github.com/emersion/go-message v0.15.0
|
||||
github.com/gorilla/websocket v1.4.2 // indirect
|
||||
github.com/emersion/go-imap v1.0.5
|
||||
github.com/emersion/go-message v0.12.0
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||
github.com/lib/pq v1.10.2
|
||||
github.com/lib/pq v1.3.0
|
||||
github.com/olebedev/when v0.0.0-20190311101825-c3b538a97254
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
|
||||
golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
)
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
github.com/AlekSi/pointer v1.0.0 h1:KWCWzsvFxNLcmM5XmiqHsGTTsuwZMsLFwWF9Y+//bNE=
|
||||
github.com/AlekSi/pointer v1.0.0/go.mod h1:1kjywbfcPFCmncIxtk6fIEub6LKrfMz3gc5QKVOSOA8=
|
||||
github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI=
|
||||
github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE=
|
||||
github.com/bwmarrin/discordgo v0.20.2 h1:nA7jiTtqUA9lT93WL2jPjUp8ZTEInRujBdx1C9gkr20=
|
||||
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/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/bwmarrin/discordgo v0.23.2 h1:BzrtTktixGHIu9Tt7dEE6diysEF9HWnXeHuoJEt2fH4=
|
||||
github.com/bwmarrin/discordgo v0.23.2/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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -21,48 +17,29 @@ github.com/dustinpianalto/disgoman v0.0.14 h1:hsk56JATBE5eH5GPCDGeiTdYxok4m+edSY
|
||||
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/disgoman v0.0.21 h1:GfT149ymB/7BAJaKn4DNB66zBAbSB1tdn3E26NGok0o=
|
||||
github.com/dustinpianalto/disgoman v0.0.21/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/go.mod h1:yKASt+C3ZiDAiCSssxg9caIckWF/JG7ZQTO7GAmvicU=
|
||||
github.com/emersion/go-imap v1.1.0 h1:hAW8Dbi/AwiVO5Wi40FTVuCzVrTmwtEK6De9GSoOy+Y=
|
||||
github.com/emersion/go-imap v1.1.0/go.mod h1:0hCeak4mA2z9hICM20jeqN6fyV0Oad0lZTyeeAyUS6o=
|
||||
github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
|
||||
github.com/emersion/go-message v0.12.0 h1:mZnv35eZ6lB6EftTQBgYXspOH0FQdhpFhSUhA9i6/Zg=
|
||||
github.com/emersion/go-message v0.12.0/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY=
|
||||
github.com/emersion/go-message v0.14.1/go.mod h1:N1JWdZQ2WRUalmdHAX308CWBq747VJ8oUorFI3VCBwU=
|
||||
github.com/emersion/go-message v0.15.0 h1:urgKGqt2JAc9NFJcgncQcohHdiYb803YTH9OQwHBHIY=
|
||||
github.com/emersion/go-message v0.15.0/go.mod h1:wQUEfE+38+7EW8p8aZ96ptg6bAb1iwdgej19uXASlE4=
|
||||
github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b h1:uhWtEWBHgop1rqEk2klKaxPAkVDCXexai6hSuRQ7Nvs=
|
||||
github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k=
|
||||
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ=
|
||||
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
|
||||
github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe h1:40SWqY0zE3qCi6ZrtTf5OUdNm5lDnGnjRSq9GgmeTrg=
|
||||
github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
|
||||
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY=
|
||||
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
|
||||
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
|
||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU=
|
||||
github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/martinlindhe/base36 v1.0.0 h1:eYsumTah144C0A8P1T/AVSUk5ZoLnhfYFM3OGQxB52A=
|
||||
github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
|
||||
github.com/martinlindhe/base36 v1.1.0 h1:cIwvvwYse/0+1CkUPYH5ZvVIYG3JrILmQEIbLuar02Y=
|
||||
github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
|
||||
github.com/olebedev/when v0.0.0-20190311101825-c3b538a97254 h1:JYoQR67E1vv1WGoeW8DkdFs7vrIEe/5wP+qJItd5tUE=
|
||||
github.com/olebedev/when v0.0.0-20190311101825-c3b538a97254/go.mod h1:DPucAeQGDPUzYUt+NaWw6qsF5SFapWWToxEiVDh2aV0=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
@@ -70,20 +47,6 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16 h1:y6ce7gCWtnH+m3dCjzQ1PCuwl28DDIc3VNnvY29DlIA=
|
||||
golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
|
||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7 h1:/bmDWM82ZX7TawqxuI8kVjKI0TXHdSY6pHJArewwHtU=
|
||||
golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5-0.20201125200606-c27b9fd57aec/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
||||
@@ -32,7 +32,7 @@ func ParseDateString(inTime time.Time) string {
|
||||
} else {
|
||||
dateString = "Now"
|
||||
}
|
||||
stamp := inTime.Format("2006-01-02 15:04:05.000")
|
||||
stamp := inTime.Format("2006-01-02 15:04:05")
|
||||
return fmt.Sprintf("%v\n%v", dateString, stamp)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,10 +19,7 @@ func ParseSnowflake(s int64) Snowflake {
|
||||
PROCESS_ID_MASK = 0x1F000
|
||||
INCREMENT_MASK = 0xFFF
|
||||
)
|
||||
t := (s >> TIME_BITS_LOC) + DISCORD_EPOCH
|
||||
sec := t / 1000.0
|
||||
nano := t % 1000.0 * 1000000.0
|
||||
creationTime := time.Unix(sec, nano)
|
||||
creationTime := time.Unix(((s>>TIME_BITS_LOC)+DISCORD_EPOCH)/1000.0, 0)
|
||||
workerID := (s & WORKER_ID_MASK) >> WORKER_ID_LOC
|
||||
processID := (s & PROCESS_ID_MASK) >> PROCESS_ID_LOC
|
||||
increment := s & INCREMENT_MASK
|
||||
|
||||
@@ -6,8 +6,8 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/services"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/services"
|
||||
)
|
||||
|
||||
// Guild management commands
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"log"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
)
|
||||
|
||||
func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) {
|
||||
@@ -29,9 +29,6 @@ func OnMessageUpdate(session *discordgo.Session, m *discordgo.MessageUpdate) {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
if m.Content == "" {
|
||||
return
|
||||
}
|
||||
embed := &discordgo.MessageEmbed{
|
||||
Title: fmt.Sprintf("Message Edited: %v", msg.ID),
|
||||
Description: fmt.Sprintf("**Before:** %v\n**After:** %v\nIn Channel: %v", msg.Content, m.Content, channel.Mention()),
|
||||
|
||||
+8
-11
@@ -2,15 +2,15 @@ package exts
|
||||
|
||||
import (
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/fun"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/guild_management"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/roles"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/tags"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/tasks"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/user_management"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/utils"
|
||||
"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"
|
||||
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/p_interpreter"
|
||||
"github.com/dustinpianalto/goff/internal/exts/p_interpreter"
|
||||
)
|
||||
|
||||
func AddCommandHandlers(h *disgoman.CommandManager) {
|
||||
@@ -27,7 +27,6 @@ func AddCommandHandlers(h *disgoman.CommandManager) {
|
||||
_ = h.AddCommand(utils.GitCommand)
|
||||
_ = h.AddCommand(utils.InviteCommand)
|
||||
_ = h.AddCommand(utils.PingCommand)
|
||||
_ = h.AddCommand(utils.SnowflakeCommand)
|
||||
_ = h.AddCommand(tasks.AddReminderCommand)
|
||||
_ = h.AddCommand(tags.AddTagCommand)
|
||||
_ = h.AddCommand(tags.TagCommand)
|
||||
@@ -35,8 +34,6 @@ func AddCommandHandlers(h *disgoman.CommandManager) {
|
||||
_ = h.AddCommand(roles.RemoveSelfAssignableCommand)
|
||||
_ = h.AddCommand(roles.SelfAssignRoleCommand)
|
||||
_ = h.AddCommand(roles.UnAssignRoleCommand)
|
||||
_ = h.AddCommand(roles.MakeAutoRoleCommand)
|
||||
_ = h.AddCommand(roles.RemoveAutoRoleCommand)
|
||||
_ = h.AddCommand(p_interpreter.PCommand)
|
||||
_ = h.AddCommand(fun.InterleaveCommand)
|
||||
_ = h.AddCommand(fun.DeinterleaveCommand)
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
)
|
||||
|
||||
var LoggingChannel = make(chan *LogEvent, 10)
|
||||
|
||||
@@ -7,9 +7,7 @@ import (
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/services"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
)
|
||||
|
||||
var MakeRoleSelfAssignableCommand = &disgoman.Command{
|
||||
@@ -256,134 +254,3 @@ func memberHasRole(m *discordgo.Member, id string) bool {
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
_, _ = ctx.Send(fmt.Sprintf("%s will be added to all new memebers.", r.Name))
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
_, _ = ctx.Send(fmt.Sprintf("%s will no longer be added to all new memebers.", r.Name))
|
||||
}
|
||||
|
||||
@@ -7,9 +7,9 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/services"
|
||||
"github.com/dustinpianalto/goff"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/services"
|
||||
)
|
||||
|
||||
var AddTagCommand = &disgoman.Command{
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
)
|
||||
|
||||
type Task struct {
|
||||
@@ -100,7 +100,6 @@ func getTasksToRun() []Task {
|
||||
res, err := postgres.DB.Query(query, time.Now())
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return nil
|
||||
}
|
||||
var tasks []Task
|
||||
for res.Next() {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
"github.com/olebedev/when"
|
||||
"github.com/olebedev/when/rules/common"
|
||||
"github.com/olebedev/when/rules/en"
|
||||
|
||||
@@ -4,8 +4,8 @@ import (
|
||||
"log"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/services"
|
||||
"github.com/dustinpianalto/goff"
|
||||
"github.com/dustinpianalto/goff/internal/services"
|
||||
)
|
||||
|
||||
func OnGuildMemberAdd(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||
@@ -41,25 +41,6 @@ func OnGuildMemberAdd(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||
if err != nil {
|
||||
log.Println("Error adding user to guild: ", err)
|
||||
}
|
||||
if !member.Member.Pending {
|
||||
roles, err := services.RoleService.GetAutoRoles(member.GuildID)
|
||||
if err != nil {
|
||||
log.Println("Error getting Auto Join Roles: ", err)
|
||||
}
|
||||
log.Println(roles)
|
||||
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) {
|
||||
@@ -90,30 +71,3 @@ func OnGuildMemberRemove(s *discordgo.Session, member *discordgo.GuildMemberRemo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func OnGuildMemberUpdate(s *discordgo.Session, member *discordgo.GuildMemberUpdate) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Println("Recovered from panic in OnGuildMemberUpdate: ", r)
|
||||
}
|
||||
}()
|
||||
if !member.Member.Pending {
|
||||
roles, err := services.RoleService.GetAutoRoles(member.GuildID)
|
||||
if err != nil {
|
||||
log.Println("Error getting Auto Join Roles: ", err)
|
||||
}
|
||||
log.Println(roles)
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/discord_utils"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff/internal/discord_utils"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
)
|
||||
|
||||
func OnGuildMemberAddLogging(s *discordgo.Session, member *discordgo.GuildMemberAdd) {
|
||||
@@ -163,4 +163,5 @@ func MarkMemberInactive(s *discordgo.Session, m *discordgo.GuildMemberRemove) {
|
||||
log.Println(fmt.Errorf("error marking %s as inactive: %w", m.User.ID, err))
|
||||
return
|
||||
}
|
||||
log.Println("User left: %s")
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/exts/logging"
|
||||
"github.com/dustinpianalto/goff/internal/exts/logging"
|
||||
)
|
||||
|
||||
var KickUserCommand = &disgoman.Command{
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"github.com/dustinpianalto/disgoman"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/discord_utils"
|
||||
"github.com/dustinpianalto/goff/internal/discord_utils"
|
||||
)
|
||||
|
||||
var PingCommand = &disgoman.Command{
|
||||
@@ -80,9 +80,9 @@ var GitCommand = &disgoman.Command{
|
||||
|
||||
func gitCommandFunc(ctx disgoman.Context, _ []string) {
|
||||
embed := &discordgo.MessageEmbed{
|
||||
Title: "Hi there, my code is on Gitea",
|
||||
Title: "Hi there, My code is on Github",
|
||||
Color: 0,
|
||||
URL: "https://gitea.wayfinderak.com/wayfinderak/goff",
|
||||
URL: "https://github.com/dustinpianalto/Goff",
|
||||
}
|
||||
_, err := ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
||||
if err != nil {
|
||||
@@ -218,32 +218,3 @@ func userCommandFunc(ctx disgoman.Context, args []string) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var SnowflakeCommand = &disgoman.Command{
|
||||
Name: "s",
|
||||
Aliases: nil,
|
||||
Description: "Return the parts of a snowflake",
|
||||
OwnerOnly: false,
|
||||
Hidden: false,
|
||||
RequiredPermissions: 0,
|
||||
SanitizeEveryone: true,
|
||||
Invoke: snowflakeCommandFunc,
|
||||
}
|
||||
|
||||
func snowflakeCommandFunc(ctx disgoman.Context, args []string) {
|
||||
int64ID, err := strconv.ParseInt(args[0], 10, 64)
|
||||
if err != nil {
|
||||
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
|
||||
Context: ctx,
|
||||
Message: "Not a valid ID",
|
||||
Error: err,
|
||||
}
|
||||
return
|
||||
}
|
||||
s := discord_utils.ParseSnowflake(int64ID)
|
||||
embed := &discordgo.MessageEmbed{
|
||||
Title: args[0],
|
||||
Description: fmt.Sprintf("Created: %s\nWorker: %d\nProcess: %d\nCounter: %d", discord_utils.ParseDateString(s.CreationTime), s.WorkerID, s.ProcessID, s.Increment),
|
||||
}
|
||||
_, _ = ctx.Session.ChannelMessageSendEmbed(ctx.Channel.ID, embed)
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
@@ -17,23 +16,17 @@ func ConnectDatabase(dbConnString string) {
|
||||
db, err := sql.Open("postgres", dbConnString)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Can't connect to the database. %v", err))
|
||||
} else {
|
||||
fmt.Println("Database Connected.")
|
||||
}
|
||||
|
||||
db.SetMaxOpenConns(5)
|
||||
db.SetMaxIdleConns(2)
|
||||
db.SetConnMaxLifetime(30 * time.Minute)
|
||||
db.SetConnMaxIdleTime(5 * time.Minute)
|
||||
|
||||
if err = db.Ping(); err != nil {
|
||||
panic(fmt.Sprintf("Can't ping the database. %v", err))
|
||||
}
|
||||
|
||||
fmt.Println("Database Connected.")
|
||||
db.SetMaxOpenConns(75) // The RDS instance has a max of 75 open connections
|
||||
db.SetMaxIdleConns(5)
|
||||
db.SetConnMaxLifetime(300)
|
||||
DB = db
|
||||
}
|
||||
|
||||
func InitializeDatabase() {
|
||||
_, err := DB.Exec("CREATE TABLE IF NOT EXISTS users(" +
|
||||
_, err := DB.Query("CREATE TABLE IF NOT EXISTS users(" +
|
||||
"id varchar(30) primary key," +
|
||||
"banned bool not null default false," +
|
||||
"logging bool not null default true," +
|
||||
@@ -45,7 +38,7 @@ func InitializeDatabase() {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("CREATE TABLE IF NOT EXISTS guilds(" +
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS guilds(" +
|
||||
"id varchar(30) primary key," +
|
||||
"welcome_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||
"goodbye_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||
@@ -55,14 +48,14 @@ func InitializeDatabase() {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("CREATE TABLE IF NOT EXISTS prefixes(" +
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS prefixes(" +
|
||||
"id serial primary key," +
|
||||
"prefix varchar(10) not null unique default 'Go.'" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("CREATE TABLE IF NOT EXISTS tags(" +
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tags(" +
|
||||
"id serial primary key," +
|
||||
"tag varchar(100) not null unique," +
|
||||
"content varchar(1000) not null," +
|
||||
@@ -73,21 +66,21 @@ func InitializeDatabase() {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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)," +
|
||||
"user_id varchar(30) not null references users(id)" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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)," +
|
||||
"prefix_id int not null references prefixes(id)" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("CREATE TABLE IF NOT EXISTS tasks(" +
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tasks(" +
|
||||
"id serial primary key," +
|
||||
"type varchar(10) not null," +
|
||||
"content text not null," +
|
||||
@@ -101,7 +94,7 @@ func InitializeDatabase() {
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec(`CREATE TABLE IF NOT EXISTS postfixes(
|
||||
_, err = DB.Query(`CREATE TABLE IF NOT EXISTS postfixes(
|
||||
id serial primary key,
|
||||
name varchar(100) not null,
|
||||
time timestamp not null default NOW())`)
|
||||
@@ -126,37 +119,37 @@ func InitializeDatabase() {
|
||||
}
|
||||
|
||||
func LoadTestData() {
|
||||
_, err := DB.Exec("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)," +
|
||||
"('692908139506434065', false, true, '', true, false, false)," +
|
||||
"('396588996706304010', false, true, '', true, true, false)")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("INSERT INTO prefixes (prefix) VALUES ('Godev.'), ('godev.'), ('godev,')")
|
||||
_, err = DB.Query("INSERT INTO prefixes (prefix) VALUES ('Godev.'), ('godev.'), ('godev,')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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', '692908139506434065')," +
|
||||
"('265828729970753537', '396588996706304010')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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', 2)," +
|
||||
"('265828729970753537', 3)")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Exec("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')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"database/sql"
|
||||
"log"
|
||||
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"github.com/dustinpianalto/goff"
|
||||
)
|
||||
|
||||
type GuildService struct {
|
||||
|
||||
@@ -32,10 +32,6 @@ var postfixes = []postfix{
|
||||
Name: "4_Add_Multi_Column_Unique_XUsersGuilds",
|
||||
Invoke: addMultiColumnUniqueXUsersGuilds,
|
||||
},
|
||||
postfix{
|
||||
Name: "5_Add_Auto_Role_To_Roles_Table",
|
||||
Invoke: addAutoRoleToRoles,
|
||||
},
|
||||
}
|
||||
|
||||
func RunPostfixes() {
|
||||
@@ -47,10 +43,8 @@ func RunPostfixes() {
|
||||
continue
|
||||
}
|
||||
if rows.Next() {
|
||||
rows.Close()
|
||||
continue
|
||||
} else {
|
||||
rows.Close()
|
||||
err := postfix.Invoke(false)
|
||||
if err != nil {
|
||||
continue
|
||||
@@ -168,20 +162,3 @@ func addMultiColumnUniqueXUsersGuilds(revert bool) error {
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"log"
|
||||
|
||||
"gitea.wayfinderak.com/wayfinderak/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_id)
|
||||
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 AND auto_role = true`
|
||||
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
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package postgres
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"github.com/dustinpianalto/goff"
|
||||
)
|
||||
|
||||
type UserService struct {
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package services
|
||||
|
||||
import "gitea.wayfinderak.com/wayfinderak/goff"
|
||||
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) {
|
||||
func InitalizeServices(us goff.UserService, gs goff.GuildService) {
|
||||
UserService = us
|
||||
GuildService = gs
|
||||
RoleService = rs
|
||||
}
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/pkg/puzzles"
|
||||
"github.com/dustinpianalto/goff/pkg/puzzles"
|
||||
imap "github.com/emersion/go-imap"
|
||||
"github.com/emersion/go-imap/client"
|
||||
"github.com/emersion/go-message/mail"
|
||||
|
||||
@@ -8,8 +8,8 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff"
|
||||
"gitea.wayfinderak.com/wayfinderak/goff/internal/postgres"
|
||||
"github.com/dustinpianalto/goff"
|
||||
"github.com/dustinpianalto/goff/internal/postgres"
|
||||
"github.com/emersion/go-message/mail"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
DATABASE_URL=postgresql://USER:PASSWORD@HOST:5432/goff?sslmode=disable
|
||||
DISCORDGO_TOKEN=replace-me
|
||||
GOFF_EMAIL_USERNAME=replace-me
|
||||
GOFF_EMAIL_PASSWORD=replace-me
|
||||
@@ -1,9 +0,0 @@
|
||||
services:
|
||||
goff:
|
||||
image: gitea.wayfinderak.com/wayfinderak/goff:latest
|
||||
container_name: goff
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- ./portainer-app.env
|
||||
mem_limit: 1g
|
||||
cpus: "2.0"
|
||||
@@ -1,21 +0,0 @@
|
||||
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)
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Keep required jobs alive; only skip reviewed non-runtime documentation paths.
|
||||
set -euo pipefail
|
||||
base="${DELIVERY_BASE:-}"
|
||||
head="$(git rev-parse HEAD)"
|
||||
run=true
|
||||
if [[ "${DELIVERY_REF:-}" != refs/tags/* && "$head" == "${DELIVERY_SHA:-}" && "${DELIVERY_EVENT:-}" =~ ^(push|pull_request)$ && "$base" =~ ^[0-9a-f]{40}$ && "$base" != 0000000000000000000000000000000000000000 ]]; then
|
||||
if ! git cat-file -e "$base^{commit}" 2>/dev/null; then
|
||||
if [[ -n "${DELIVERY_FETCH_TOKEN:-}" ]]; then
|
||||
git -c "http.extraHeader=Authorization: token ${DELIVERY_FETCH_TOKEN}" fetch --quiet --depth=1 origin "$base" >/dev/null 2>&1 || true
|
||||
else
|
||||
git fetch --quiet --depth=1 origin "$base" >/dev/null 2>&1 || true
|
||||
fi
|
||||
fi
|
||||
if git cat-file -e "$base^{commit}" 2>/dev/null; then
|
||||
paths="$(mktemp)"
|
||||
trap 'rm -f -- "$paths"' EXIT
|
||||
# Snapshot comparison is conservative when main advanced during a PR.
|
||||
# Both rename sides remain visible, including names containing newlines.
|
||||
if git diff --no-renames --name-only -z "$base" "$head" > "$paths"; then
|
||||
run=false
|
||||
while IFS= read -r -d '' path; do
|
||||
case "$path" in
|
||||
README.md|CHANGELOG.md|LICENSE|LICENSE.md) ;;
|
||||
*) run=true; break ;;
|
||||
esac
|
||||
done < "$paths"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [[ "$run" == false ]]; then
|
||||
echo 'Only reviewed non-runtime documentation changed; build and validation are not applicable.'
|
||||
else
|
||||
echo 'Runtime, unknown inputs, or unavailable event history: run required validation.'
|
||||
fi
|
||||
if [[ -n "${GITHUB_OUTPUT:-}" ]]; then
|
||||
echo "run=$run" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
printf '%s\n' "$run"
|
||||
Reference in New Issue
Block a user