ImplMessageMonitor #1
@@ -1,2 +1,24 @@
 | 
			
		||||
DISCORD_BOT_TOKEN = "your_bot_token"
 | 
			
		||||
DISCORD_SERVER_ID = "your_server_id"
 | 
			
		||||
[DISCORD]
 | 
			
		||||
  BOT_TOKEN = ""
 | 
			
		||||
 | 
			
		||||
[[SERVERS]]
 | 
			
		||||
  SERVER_ID = ""
 | 
			
		||||
  OUTPUT_CHANNEL_ID = ""
 | 
			
		||||
  PREFIX_ENABLED = true
 | 
			
		||||
  [SERVERS.COIN_REGEXES]
 | 
			
		||||
    Bitcoin = "[13][a-km-zA-HJ-NP-Z1-9]{25,34}"
 | 
			
		||||
    Ethereum = "0x[a-fA-F0-9]{40}"
 | 
			
		||||
  [SERVERS.CHANNEL_BLACKLIST]
 | 
			
		||||
    CHANNELS = [""]
 | 
			
		||||
 | 
			
		||||
[[SERVERS]]
 | 
			
		||||
  SERVER_ID = ""
 | 
			
		||||
  OUTPUT_CHANNEL_ID = ""
 | 
			
		||||
  PREFIX_ENABLED = false 
 | 
			
		||||
  [SERVERS.COIN_REGEXES]
 | 
			
		||||
    Ethereum = "0x[a-fA-F0-9]{40}"
 | 
			
		||||
    Solana = "[1-9A-HJ-NP-Za-km-z]{32,44}"
 | 
			
		||||
  [SERVERS.CHANNEL_BLACKLIST]
 | 
			
		||||
    CHANNELS = []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										223
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										223
									
								
								main.go
									
									
									
									
									
								
							@@ -1,102 +1,159 @@
 | 
			
		||||
	package main
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
	import (
 | 
			
		||||
		"fmt"
 | 
			
		||||
		"os"
 | 
			
		||||
		"regexp"
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"regexp"
 | 
			
		||||
 | 
			
		||||
		"github.com/BurntSushi/toml"
 | 
			
		||||
		"github.com/bwmarrin/discordgo"
 | 
			
		||||
	)
 | 
			
		||||
	"github.com/BurntSushi/toml"
 | 
			
		||||
	"github.com/bwmarrin/discordgo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		Token         string
 | 
			
		||||
		ServerID       string
 | 
			
		||||
		OutputChannelID string
 | 
			
		||||
	)
 | 
			
		||||
var (
 | 
			
		||||
	Token           string
 | 
			
		||||
	Servers         []ServerConfig
 | 
			
		||||
	CoinRegexes     map[string]*regexp.Regexp
 | 
			
		||||
	ChannelBlacklist map[string][]string
 | 
			
		||||
	PrefixEnabled   bool
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
	func init() {
 | 
			
		||||
		var config struct {
 | 
			
		||||
			Token         string `toml:"DISCORD_BOT_TOKEN"`
 | 
			
		||||
			ServerID       string `toml:"DISCORD_SERVER_ID"`
 | 
			
		||||
			OutputChannelID string `toml:"OUTPUT_CHANNEL_ID"`
 | 
			
		||||
		}
 | 
			
		||||
type ServerConfig struct {
 | 
			
		||||
	ServerID       string `toml:"SERVER_ID"`
 | 
			
		||||
	OutputChannelID string `toml:"OUTPUT_CHANNEL_ID"`
 | 
			
		||||
	CoinRegexes    map[string]string `toml:"COIN_REGEXES"`
 | 
			
		||||
	ChannelBlacklist struct {
 | 
			
		||||
		Channels []string `toml:"CHANNELS"`
 | 
			
		||||
	} `toml:"CHANNEL_BLACKLIST"`
 | 
			
		||||
	PrefixEnabled bool `toml:"PREFIX_ENABLED"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		if _, err := toml.DecodeFile("config.toml", &config); err != nil {
 | 
			
		||||
			fmt.Println("Error loading config:", err)
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Token = config.Token
 | 
			
		||||
		ServerID = config.ServerID
 | 
			
		||||
		OutputChannelID = config.OutputChannelID
 | 
			
		||||
 | 
			
		||||
		if Token == "" {
 | 
			
		||||
			fmt.Println("No token provided in config.toml.")
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ServerID == "" {
 | 
			
		||||
			fmt.Println("No server ID provided in config.toml.")
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if OutputChannelID == "" {
 | 
			
		||||
			fmt.Println("No output channel ID in config.toml")
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
func init() {
 | 
			
		||||
	var config struct {
 | 
			
		||||
		Discord struct {
 | 
			
		||||
			BotToken string `toml:"BOT_TOKEN"`
 | 
			
		||||
		} `toml:"DISCORD"`
 | 
			
		||||
		Servers []ServerConfig `toml:"SERVERS"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func main() {
 | 
			
		||||
		dg, err := discordgo.New("Bot " + Token)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("Error creating Discord session:", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		dg.AddHandler(ready)
 | 
			
		||||
		dg.AddHandler(messageCreate)
 | 
			
		||||
 | 
			
		||||
		dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentMessageContent
 | 
			
		||||
 | 
			
		||||
		err = dg.Open()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("Error opening connection:", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fmt.Println("Bot is now running. Press CTRL+C to exit.")
 | 
			
		||||
		select {}
 | 
			
		||||
	if _, err := toml.DecodeFile("config.toml", &config); err != nil {
 | 
			
		||||
		fmt.Println("Error loading config:", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func ready(s *discordgo.Session, event *discordgo.Ready) {
 | 
			
		||||
		s.UpdateGameStatus(0, "Monitoring messages")
 | 
			
		||||
	Token = config.Discord.BotToken
 | 
			
		||||
	Servers = config.Servers
 | 
			
		||||
 | 
			
		||||
	CoinRegexes = make(map[string]*regexp.Regexp)
 | 
			
		||||
	ChannelBlacklist = make(map[string][]string)
 | 
			
		||||
 | 
			
		||||
	for _, server := range Servers {
 | 
			
		||||
		for coin, regex := range server.CoinRegexes {
 | 
			
		||||
			fullRegex := fmt.Sprintf(`\b%s\b`, regex)
 | 
			
		||||
			CoinRegexes[coin] = regexp.MustCompile(fullRegex)
 | 
			
		||||
		}
 | 
			
		||||
		ChannelBlacklist[server.ServerID] = server.ChannelBlacklist.Channels
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
 | 
			
		||||
		if m.Author.ID == s.State.User.ID {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	if Token == "" {
 | 
			
		||||
		fmt.Println("No token provided in config.toml.")
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		channel, err := s.State.Channel(m.ChannelID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			fmt.Println("Error getting channel:", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
func main() {
 | 
			
		||||
	dg, err := discordgo.New("Bot " + Token)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Error creating Discord session:", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		if channel.GuildID != ServerID {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	dg.AddHandler(ready)
 | 
			
		||||
	dg.AddHandler(messageCreate)
 | 
			
		||||
 | 
			
		||||
		fmt.Printf("Message from %s: %s\n", m.Author.Username, m.Content)
 | 
			
		||||
	dg.Identify.Intents = discordgo.IntentsGuilds | discordgo.IntentsGuildMessages | discordgo.IntentMessageContent
 | 
			
		||||
 | 
			
		||||
	err = dg.Open()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Error opening connection:", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		re := regexp.MustCompile(`\b\w{36,44}\b`)
 | 
			
		||||
			match := re.FindStringSubmatch(m.Content)
 | 
			
		||||
			if len(match) > 0 {
 | 
			
		||||
				matchedWord := match[0]
 | 
			
		||||
				message := fmt.Sprintf("%s", matchedWord)
 | 
			
		||||
				s.ChannelMessageSend(OutputChannelID, message)
 | 
			
		||||
	fmt.Println("Bot is now running. Press CTRL+C to exit.")
 | 
			
		||||
	select {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ready(s *discordgo.Session, event *discordgo.Ready) {
 | 
			
		||||
	s.UpdateGameStatus(0, "Monitoring messages")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
 | 
			
		||||
	if m.Author.ID == s.State.User.ID {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, server := range Servers {
 | 
			
		||||
		if m.GuildID == server.ServerID {
 | 
			
		||||
			channel, err := s.State.Channel(m.ChannelID)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				fmt.Println("Error getting channel:", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if isChannelBlacklisted(server.ServerID, channel.ID) {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			checkMessageContent(s, server, m)
 | 
			
		||||
			checkEmbeds(s, server, m)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkMessageContent(s *discordgo.Session, server ServerConfig, m *discordgo.MessageCreate) {
 | 
			
		||||
	for coin, regex := range CoinRegexes {
 | 
			
		||||
		match := regex.FindStringSubmatch(m.Content)
 | 
			
		||||
		if len(match) > 0 {
 | 
			
		||||
			matchedAddress := match[0]
 | 
			
		||||
			message := formatMessage(server, coin, m.Author.Username, matchedAddress)
 | 
			
		||||
			s.ChannelMessageSend(server.OutputChannelID, message)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkEmbeds(s *discordgo.Session, server ServerConfig, m *discordgo.MessageCreate) {
 | 
			
		||||
	for _, embed := range m.Message.Embeds {
 | 
			
		||||
		if embed.Type == "rich" && embed.Description != "" {
 | 
			
		||||
			for coin, regex := range CoinRegexes {
 | 
			
		||||
				match := regex.FindStringSubmatch(embed.Description)
 | 
			
		||||
				if len(match) > 0 {
 | 
			
		||||
					matchedAddress := match[0]
 | 
			
		||||
					message := formatMessage(server, coin, m.Author.Username, matchedAddress)
 | 
			
		||||
					s.ChannelMessageSend(server.OutputChannelID, message)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func formatMessage(server ServerConfig, coin, username, address string) string {
 | 
			
		||||
	if server.PrefixEnabled {
 | 
			
		||||
		return fmt.Sprintf("%s: %s", coin, address)
 | 
			
		||||
	}
 | 
			
		||||
	return address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isChannelBlacklisted(serverID, channelID string) bool {
 | 
			
		||||
	blacklistedChannels, ok := ChannelBlacklist[serverID]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, id := range blacklistedChannels {
 | 
			
		||||
		if id == channelID {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user