Skip to content

Commit

Permalink
Update some things
Browse files Browse the repository at this point in the history
- Changed to ignore messages explicitly marked as "reposted"
- Added ability to delete messages with specific reactions
- Modified to ignore root and some domains by default
- Added to add and remove domains into the list, and view domain list from Discord
- Fixed typo
  • Loading branch information
lb-migii committed May 6, 2023
1 parent 2fffd61 commit f4f51b3
Show file tree
Hide file tree
Showing 10 changed files with 280 additions and 17 deletions.
22 changes: 12 additions & 10 deletions config.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
debug: true
help: https://github.com/tpc3/DuckPolice/wiki
discord:
token: "YOUR_TOKEN_HERE"
status: "Duck Police is observing you | p.help"
token: YOUR_TOKEN_HERE
status: Duck Police is observing you | p.help
duplicate:
deletemessage: false
alert: "reply"
message: "既出警察だ!"
react: "🚨"
alert: reply
message: 既出警察だ!
react: "\U0001F6A8"
delete:
trigger: ""
db:
kind: sqlite3
parameter: ./db.sqlite
Expand All @@ -18,10 +20,10 @@ guild:
domain:
type: white
list:
- "twitter.com"
- "youtube.com"
- twitter.com
- youtube.com
user_blacklist:
- "0000000000000000000" # Add here to ignore user at all
- "0000000000000000000"
channel_blacklist:
- "000000000000000000" # Add here to ignore channel at all
log_period: 2592000 # 30 days
- "000000000000000000"
log_period: 2592000
94 changes: 94 additions & 0 deletions lib/cmds/domain.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package cmds

import (
"errors"
"strings"

"github.com/bwmarrin/discordgo"
"github.com/tpc3/DuckPolice/lib/config"
"github.com/tpc3/DuckPolice/lib/db"
"github.com/tpc3/DuckPolice/lib/embed"
)

const Domain = "domain"

func DomainCmd(session *discordgo.Session, orgMsg *discordgo.MessageCreate, guild *config.Guild, message *string) {
split := strings.SplitN(*message, " ", 2)
if *message == "" {
DomainUsage(session, orgMsg, guild, errors.New("not enough arguments"))
}
if (split[0] == "add" || split[0] == "del") && len(split) != 2 {
DomainUsage(session, orgMsg, guild, errors.New("not enough arguments"))
return
}
currentlist := config.CurrentConfig.Domain.YamlList
currentmap := config.ListMap
var list string
var newlist []string
switch split[0] {
case "add":
currentlist = append(currentlist, split[1])
currentmap[split[1]] = true
domain := config.Domain{
Type: config.CurrentConfig.Domain.Type,
YamlList: currentlist,
}
err := config.SaveGuild(guild, &domain)
if err != nil {
UnknownError(session, orgMsg, &guild.Lang, err)
return
}
session.MessageReactionAdd(orgMsg.ChannelID, orgMsg.ID, "👍")
case "del":
newlist = RemoveElement(&currentlist, &split[1])
currentmap[split[1]] = false
domain := config.Domain{
Type: config.CurrentConfig.Domain.Type,
YamlList: newlist,
}
err := config.SaveGuild(guild, &domain)
if err != nil {
UnknownError(session, orgMsg, &guild.Lang, err)
return
}
session.MessageReactionAdd(orgMsg.ChannelID, orgMsg.ID, "👍")
case "list":
for _, v := range currentlist {
list += "- " + v + "\n"
}
embed := embed.NewEmbed(session, orgMsg)
embed.Title = "Domain List"
embed.Description = "```yaml\n" + list + "```"
SendEmbed(session, orgMsg, embed)
}
err := db.SaveGuild(&orgMsg.GuildID, guild)
if err != nil {
UnknownError(session, orgMsg, &guild.Lang, err)
return
}
}

func RemoveElement(list *[]string, element *string) []string {
currentlist := *list
index := -1
for i, v := range currentlist {
if v == *element {
index = i
break
}
}
if index == -1 {
return currentlist
}
return append(currentlist[:index], currentlist[index+1:]...)
}

func DomainUsage(session *discordgo.Session, orgMsg *discordgo.MessageCreate, guild *config.Guild, err error) {
msg := embed.NewEmbed(session, orgMsg)
if err != nil {
msg.Title = config.Lang[guild.Lang].Error.Syntax
msg.Description = err.Error() + "\n"
msg.Color = embed.ColorPink
}
ReplyEmbed(session, orgMsg, msg)
}
11 changes: 11 additions & 0 deletions lib/cmds/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ import (
"github.com/tpc3/DuckPolice/lib/embed"
)

func SendEmbed(session *discordgo.Session, orgMsg *discordgo.MessageCreate, embed *discordgo.MessageEmbed) {
send := discordgo.MessageSend{}
send.Embed = embed
_, err := session.ChannelMessageSendComplex(orgMsg.ChannelID, &send)
if err != nil {
log.Print("Failed to send embed: ", err)
}
}

func ReplyEmbed(session *discordgo.Session, orgMsg *discordgo.MessageCreate, embed *discordgo.MessageEmbed) {
reply := discordgo.MessageSend{}
reply.Embed = embed
Expand Down Expand Up @@ -58,6 +67,8 @@ func HandleCmd(session *discordgo.Session, orgMsg *discordgo.MessageCreate, guil
ConfigCmd(session, orgMsg, guild, &param)
case Clean:
CleanCmd(session, orgMsg, guild, &param)
case Domain:
DomainCmd(session, orgMsg, guild, &param)
default:
ErrorReply(session, orgMsg, config.Lang[guild.Lang].Error.NoCmd)
}
Expand Down
77 changes: 72 additions & 5 deletions lib/config/config.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package config

import (
"errors"
"log"
"os"

Expand All @@ -20,16 +21,16 @@ type Config struct {
Message string
React string
}
Delete struct {
Trigger string
}
Db struct {
Kind string
Parameter string
Tableprefix string
}
Guild Guild
Domain struct {
Type string
YamlList []string `yaml:"list"`
}
Guild Guild
Domain Domain
UserBlacklist []string `yaml:"user_blacklist"`
ChannelBlacklist []string `yaml:"channel_blacklist"`
LogPeriod int64 `yaml:"log_period"`
Expand All @@ -40,6 +41,11 @@ type Guild struct {
Lang string
}

type Domain struct {
Type string
YamlList []string `yaml:"list"`
}

var ListMap map[string]bool

const configFile = "./config.yml"
Expand Down Expand Up @@ -80,4 +86,65 @@ func init() {
}

loadLang()

err = VerifyGuild(&CurrentConfig.Guild)
if err != nil {
log.Fatal("Config verify failed: ", err)
}
}

func VerifyGuild(guild *Guild) error {
if len(guild.Prefix) == 0 || len(guild.Prefix) >= 10 {
return errors.New("prefix is too short or long")
}
_, exists := Lang[guild.Lang]
if !exists {
return errors.New("language does not exists")
}
return nil
}

func SaveGuild(guild *Guild, domain *Domain) error {
file, err := os.ReadFile(configFile)
if err != nil {
return err
}

var config Config
err = yaml.Unmarshal(file, &config)
if err != nil {
return err
}

if guild.Prefix != CurrentConfig.Guild.Prefix || guild.Lang != CurrentConfig.Guild.Lang {
CurrentConfig.Guild.Prefix = guild.Prefix
CurrentConfig.Guild.Lang = guild.Lang
}

newConfig := Config{
Debug: config.Debug,
Help: config.Help,
Discord: config.Discord,
Duplicate: config.Duplicate,
Delete: config.Delete,
Db: config.Db,
Guild: *guild,
Domain: *domain,
UserBlacklist: config.UserBlacklist,
ChannelBlacklist: config.ChannelBlacklist,
LogPeriod: config.LogPeriod,
}
data, err := yaml.Marshal(&newConfig)
if err != nil {
return err
}

err = os.WriteFile(configFile, data, 0666)
if err != nil {
return err
}

CurrentConfig = newConfig

return nil
}
2 changes: 1 addition & 1 deletion lib/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func init() {
}
updateGuildStmt, err = db.Prepare("UPDATE " + config.CurrentConfig.Db.Tableprefix + "guilds " + "SET db_version = ?, prefix = ?, lang = ? " + "WHERE id = ?")
if err != nil {
log.Fatal("Prepare updateGuildStmt error", err)
log.Fatal("Prepare updateGuildStmt error: ", err)
}
addLogStmt = map[string]*sql.Stmt{}
updateLogStmt = map[string]*sql.Stmt{}
Expand Down
19 changes: 19 additions & 0 deletions lib/handler/message_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,27 @@ func MessageCreate(session *discordgo.Session, orgMsg *discordgo.MessageCreate)
return
}

if strings.Contains(orgMsg.Content, "再掲") {
return
}

guild := db.LoadGuild(&orgMsg.GuildID)

/*
channel, err := session.Channel(orgMsg.ChannelID)
if err != nil {
log.Fatal("Failed to get channel info: ", err)
}
switch channel.Type {
case discordgo.ChannelTypeGuildPrivateThread:
return
case discordgo.ChannelTypeGuildPublicThread:
return
case discordgo.ChannelTypeGuildForum:
return
}
*/

isCmd := false
var trimedMsg string
if strings.HasPrefix(orgMsg.Content, guild.Prefix) {
Expand Down
30 changes: 30 additions & 0 deletions lib/handler/message_reaction_add.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package handler

import (
"log"

"github.com/tpc3/DuckPolice/lib/config"

"github.com/bwmarrin/discordgo"
)

func MessageReactionAdd(session *discordgo.Session, msgreact *discordgo.MessageReactionAdd) {
msg, err := session.State.Message(msgreact.ChannelID, msgreact.MessageID)
if err != nil {
msg, err = session.ChannelMessage(msgreact.ChannelID, msgreact.MessageID)
if err != nil {
log.Panic("Failed to get channel message: ", err)
}
}

if msgreact.Emoji.ID == "" && msgreact.Emoji.Name == "" {
return
}

reactions, err := session.MessageReactions(msgreact.ChannelID, msgreact.MessageID, config.CurrentConfig.Delete.Trigger, 100, "", "")
if err != nil {
log.Panic("Failed to get msgreacts: ", err)
}

ReactionCheck(session, msgreact, msg, reactions)
}
20 changes: 20 additions & 0 deletions lib/handler/reaction_check.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package handler

import (
"github.com/bwmarrin/discordgo"
"github.com/tpc3/DuckPolice/lib/config"
)

func ReactionCheck(session *discordgo.Session, msgreact *discordgo.MessageReactionAdd, msg *discordgo.Message, reactions []*discordgo.User) {
reacted := false
for _, user := range reactions {
if user.ID != session.State.User.ID {
reacted = true
}
}

if reacted && (msgreact.Emoji.ID == config.CurrentConfig.Delete.Trigger || msgreact.Emoji.Name == config.CurrentConfig.Delete.Trigger) {
session.MessageReactionRemove(msgreact.ChannelID, msg.MessageReference.MessageID, config.CurrentConfig.Duplicate.React, session.State.User.ID)
session.ChannelMessageDelete(msgreact.ChannelID, msgreact.MessageID)
}
}
19 changes: 19 additions & 0 deletions lib/handler/url_check.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,30 @@ func parseMsg(origin string) []string {
url_loop:
for _, rawUrl := range urlWithPathRegex.FindAllString(origin, -1) {
rawUrl = strings.ToLower(rawUrl)
rawUrl = strings.ReplaceAll(rawUrl, "fxtwitter.com/", "twitter.com/")
rawUrl = strings.ReplaceAll(rawUrl, "youtu.be/", "youtube.com/watch?v=")
Url, err := url.Parse(rawUrl)
if err != nil {
log.Panic("Invalid URL: ", rawUrl)
}
switch Url.Path {
case "":
continue url_loop
case "/":
continue url_loop
}
switch Url.Host {
case "127.0.0.1":
continue url_loop
case "localhost":
continue url_loop
case "discord.com":
continue url_loop
case "google.com":
continue url_loop
case "letmegooglethat.com":
continue url_loop
}
list := config.ListMap
switch config.CurrentConfig.Domain.Type {
case "black":
Expand Down
3 changes: 2 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ func main() {
log.Fatal("error creating Discord session: ", err)
}
discord.AddHandler(handler.MessageCreate)
discord.Identify.Intents = discordgo.MakeIntent(discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentsMessageContent | discordgo.IntentsDirectMessages)
discord.AddHandler(handler.MessageReactionAdd)
discord.Identify.Intents = discordgo.MakeIntent(discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentsMessageContent | discordgo.IntentsGuildMessageReactions | discordgo.IntentsDirectMessages)
err = discord.Open()
if err != nil {
log.Fatal("error opening connection: ", err)
Expand Down

0 comments on commit f4f51b3

Please sign in to comment.