Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"image": "mcr.microsoft.com/devcontainers/universal:5",
"customizations": {
"vscode": {
"extensions": [
"golang.Go",
"GitHub.vscode-github-actions",
"ms-azuretools.vscode-docker"
]
}
}
}
28 changes: 7 additions & 21 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -1,53 +1,39 @@
name: CI
on:
push:
branches: [ master ]
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
tags: ["modules.all", "modules.polls"]

env:
IMAGE_TAG: ${{ matrix.tags }}

steps:
- name: Correct env
run:
echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV}

- name: Check out code into the proper directory
uses: actions/checkout@v1
uses: actions/checkout@v7

- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v1
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
uses: docker/setup-buildx-action@v4

- name: Login to GitHub Container Registry
uses: docker/login-action@v1
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Get docker tag
if: ${{ matrix.tags == 'modules.all' }}
run:
echo "IMAGE_TAG=latest" >>${GITHUB_ENV}

- name: Build container
uses: docker/build-push-action@v2
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ghcr.io/${{ env.REPO }}:${{ env.IMAGE_TAG }}
build-args: |
tags=${{ matrix.tags }},databases.all
tags: ghcr.io/${{ env.REPO }}:latest
platforms: linux/amd64,linux/arm64
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"chat.disableAIFeatures": true,
"go.testTimeout": "5m",
"go.diagnostic.vulncheck": "Off"
}
16 changes: 9 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
###
# Builder to compile our golang code
###
FROM golang:1.24-alpine AS builder
FROM --platform=$BUILDPLATFORM tonistiigi/xx AS xx

ARG tags="modules.all,databases.all"
FROM --platform=$BUILDPLATFORM golang:alpine AS builder

COPY --from=xx / /

WORKDIR /build

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o absol -buildvcs=false -tags=$tags -v github.com/lordralex/absol/core
RUN xx-go build -o absol -buildvcs=false -v github.com/lordralex/absol/core

###
# Now generate our smaller image
Expand All @@ -17,9 +23,5 @@ FROM alpine

COPY --from=builder /build/absol /go/bin/absol

ENV DISCORD_TOKEN="YOUR DISCORD BOT TOKEN"
ENV DATABASE_DIALECT="mysql"
ENV DATABASE_URL=""

ENTRYPOINT ["/go/bin/absol"]
CMD ["all"]
34 changes: 34 additions & 0 deletions api/application.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package api

import (
"github.com/bwmarrin/discordgo"
"github.com/lordralex/absol/api/env"
"github.com/lordralex/absol/api/logger"
)

func RegisterSlashCommnand(ds *discordgo.Session, guilds []string, cmd *discordgo.ApplicationCommand, function ApplicationCommand) {
appId := env.Get("discord.app_id")

ds.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) {
for _, v := range guilds {
logger.Out().Printf("Registering %s for guild %s\n", cmd.Name, v)
_, err := s.ApplicationCommandCreate(appId, v, cmd)
if err != nil {
logger.Err().Printf("Cannot create slash command %q: %v", cmd.Name, err)
}
}
})

ds.AddHandler(func(s *discordgo.Session, i *discordgo.InteractionCreate) {
switch i.Type {
case discordgo.InteractionApplicationCommand:
{
if i.ApplicationCommandData().Name == cmd.Name {
function(s, i)
}
}
}
})
}

type ApplicationCommand func(s *discordgo.Session, i *discordgo.InteractionCreate)
44 changes: 15 additions & 29 deletions api/database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@ package database

import (
"database/sql"
"errors"
"github.com/lordralex/absol/api/env"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"fmt"
"sync"
"time"

"github.com/lordralex/absol/api/env"
"github.com/lordralex/absol/api/logger"
"gorm.io/driver/mysql"
"gorm.io/gorm"
gormLogger "gorm.io/gorm/logger"
)

var databaseConn *gorm.DB
var locker sync.Mutex

var dialects = map[string]Dialect{}

func Get() (*gorm.DB, error) {
var err error

Expand All @@ -31,27 +32,16 @@ func Get() (*gorm.DB, error) {
}

func load() (db *gorm.DB, err error) {
var dialect Dialect
//TODO: Remove default when other drivers are supported
dialectName := env.GetOr("database.dialect", "mysql")
if dialectName == "" {
if len(dialects) == 1 {
for _, v := range dialects {
dialect = v
break
}
} else {
return nil, errors.New("no database dialects or more than 1 dialect available with none selected using database.dialect")
}
} else {
dialect = dialects[dialectName]
}
user := env.GetOr("database.user", "discord")
pass := env.GetOr("database.pass", "discord")
host := env.GetOr("database.host", "localhost:3306")
dbName := env.GetOr("database.db", "discord")

if dialect == nil {
return nil, errors.New("unknown database dialect " + dialectName)
}
logger.Debug().Printf("Connecting to DB: %s - %s", host, dbName)

connString := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True", user, pass, host, dbName)

db, err = gorm.Open(dialect.Load(), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
db, err = gorm.Open(mysql.Open(connString), &gorm.Config{Logger: gormLogger.Default.LogMode(gormLogger.Info)})
if db != nil {
sqlDb, _ := db.DB()
sqlDb.SetConnMaxLifetime(time.Second * 10)
Expand All @@ -67,7 +57,3 @@ func Execute(stmt *sql.Stmt, args ...interface{}) error {
_, err := stmt.Exec(args...)
return err
}

type Dialect interface {
Load() gorm.Dialector
}
32 changes: 0 additions & 32 deletions api/database/database_mysql.go

This file was deleted.

11 changes: 11 additions & 0 deletions api/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,14 @@ func GetChannel(ds *discordgo.Session, channelId string) *discordgo.Channel {

return c
}

func CleanStringArray(source []string) (result []string) {
result = make([]string, 0)
for _, v := range source {
if v == "" {
continue
}
result = append(result, v)
}
return
}
86 changes: 0 additions & 86 deletions database.sql
Original file line number Diff line number Diff line change
@@ -1,56 +1,3 @@
CREATE TABLE IF NOT EXISTS `messages` (
`id` bigint(20) unsigned NOT NULL,
`sender` varchar(50) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
`guild_id` bigint(20) DEFAULT NULL,
`channel_id` bigint(20) DEFAULT NULL,
`channel` varchar(50) DEFAULT NULL,
`content` mediumtext NOT NULL DEFAULT '',
`deleted` bit(1) NOT NULL DEFAULT b'0',
`reply_id` bigint(20) DEFAULT NULL,
`aud_create_date` timestamp NOT NULL DEFAULT current_timestamp(),
`aud_update_date` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
KEY `sender` (`sender`),
KEY `channel` (`channel_id`),
KEY `guild` (`guild_id`),
KEY `user_id` (`user_id`),
FULLTEXT KEY `content` (`content`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `attachments` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`message_id` bigint(20) NOT NULL,
`url` varchar(4000) DEFAULT NULL,
`name` varchar(4000) DEFAULT NULL,
`contents` longblob DEFAULT NULL,
`is_compressed` bit DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=34734 DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `channels` (
`id` bigint(20) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `edits` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`message_id` bigint(20) unsigned NOT NULL,
`old_content` blob NOT NULL,
`create_date` timestamp NOT NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
KEY `FK_edits_messages` (`message_id`),
CONSTRAINT `FK_edits_messages` FOREIGN KEY (`message_id`) REFERENCES `messages` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=109893 DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `guilds` (
`id` bigint(20) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `sites` (
`name` varchar(50) NOT NULL,
Expand Down Expand Up @@ -86,36 +33,3 @@ CREATE TABLE IF NOT EXISTS `sites_timed_out` (
`log` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) unsigned NOT NULL,
`name` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `factoids` (
`name` varchar(128) NOT NULL,
`content` varchar(1024) NOT NULL,
PRIMARY KEY (`name`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `hjts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) CHARACTER SET utf8mb4 NOT NULL,
`match_criteria` varchar(128) CHARACTER SET utf8mb4 DEFAULT NULL,
`description` varchar(1024) DEFAULT NULL,
`category` varchar(50) DEFAULT NULL,
`severity` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `category` (`category`)
) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

CREATE TABLE IF NOT EXISTS `permissions` (
`discord_id` varchar(50) NOT NULL,
`permission` varchar(64) NOT NULL,
PRIMARY KEY (`discord_id`,`permission`) USING BTREE,
KEY `discord_id` (`discord_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
Loading