179 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package bot
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"log"
 | 
						|
	getMaze "mazesolver/internal/getmaze"
 | 
						|
	"mazesolver/internal/outputmaze"
 | 
						|
	"mazesolver/internal/solvemaze"
 | 
						|
	"os"
 | 
						|
	"os/signal"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/bwmarrin/discordgo"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
    appId = "1335044960898252830"
 | 
						|
    guildId = ""
 | 
						|
)
 | 
						|
 | 
						|
func Run(BotToken string) {
 | 
						|
    discord, err := discordgo.New(("Bot " + BotToken))
 | 
						|
    if err != nil { fmt.Println("Bot 1"); log.Fatal(err) }
 | 
						|
 | 
						|
    _, err = discord.ApplicationCommandBulkOverwrite(appId, guildId, []*discordgo.ApplicationCommand {
 | 
						|
        {
 | 
						|
            Name: "solve-maze",
 | 
						|
            Description: "solve one of tilley's mazes",
 | 
						|
            Options: []*discordgo.ApplicationCommandOption {
 | 
						|
                    {
 | 
						|
                        Type: discordgo.ApplicationCommandOptionString,
 | 
						|
                        Name: "message-link",
 | 
						|
                        Description: "link to maze image",
 | 
						|
                        Required: true,
 | 
						|
                    },
 | 
						|
                },
 | 
						|
            },
 | 
						|
        },
 | 
						|
    )
 | 
						|
    if err != nil { fmt.Println("Bot 2"); log.Fatal(err) }
 | 
						|
 | 
						|
    discord.AddHandler(func (
 | 
						|
        s *discordgo.Session,
 | 
						|
        i *discordgo.InteractionCreate,
 | 
						|
    ) {
 | 
						|
        if i.Type == discordgo.InteractionApplicationCommand {
 | 
						|
            data := i.ApplicationCommandData()
 | 
						|
            responseData := ""
 | 
						|
            if i.Interaction.Member.User.ID == s.State.User.ID { return; }
 | 
						|
 | 
						|
            switch data.Name {
 | 
						|
            case "solve-maze":
 | 
						|
                maze, err := getMaze.GetMaze(i.ApplicationCommandData().Options[0].Value.(string))
 | 
						|
                if err != nil {
 | 
						|
                    responseData = "You must provide an image! Select the maze, click \"open in browser\", and copy the link of the image"
 | 
						|
                } else {
 | 
						|
                    if (len(maze) < 1) {
 | 
						|
                        responseData = "You must provide an image! Select the maze, click \"open in browser\", and copy the link of the image"
 | 
						|
                    } else {
 | 
						|
                        points := solvemaze.FindPath(maze)
 | 
						|
                        if (len(points) < 1) {
 | 
						|
                            responseData = "You must provide an image! Select the maze, click \"open in browser\", and copy the link of the image"
 | 
						|
                        } else {
 | 
						|
                            outputmaze.EditMaze(points, "/tmp/maze.png", "/tmp/outputmaze.png")
 | 
						|
                            maze = nil
 | 
						|
                            points = nil
 | 
						|
            }}}}
 | 
						|
 | 
						|
            if responseData != "" {
 | 
						|
                err = s.InteractionRespond(
 | 
						|
                    i.Interaction,
 | 
						|
                    &discordgo.InteractionResponse{
 | 
						|
                        Type: discordgo.InteractionResponseChannelMessageWithSource,
 | 
						|
                        Data: &discordgo.InteractionResponseData{
 | 
						|
                            Flags: 1 << 6,
 | 
						|
                            Content: responseData,
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                )
 | 
						|
            } else {
 | 
						|
                fileName := "/tmp/outputmaze.png"
 | 
						|
                f, _ := os.Open(fileName)
 | 
						|
                defer f.Close()
 | 
						|
                err = s.InteractionRespond(
 | 
						|
                    i.Interaction,
 | 
						|
                    &discordgo.InteractionResponse{
 | 
						|
                        Type: discordgo.InteractionResponseChannelMessageWithSource,
 | 
						|
                        Data: &discordgo.InteractionResponseData{
 | 
						|
                                Files: []*discordgo.File{
 | 
						|
                                &discordgo.File{
 | 
						|
                                    Name:  fileName,
 | 
						|
                                    Reader: f,
 | 
						|
                                },
 | 
						|
                            },
 | 
						|
                        },
 | 
						|
                    },
 | 
						|
                )
 | 
						|
            }
 | 
						|
            if err != nil {
 | 
						|
                fmt.Println(err)
 | 
						|
            }
 | 
						|
        }
 | 
						|
    })
 | 
						|
 | 
						|
    discord.AddHandler(func (
 | 
						|
        s *discordgo.Session,
 | 
						|
        m *discordgo.MessageCreate,
 | 
						|
    ) {
 | 
						|
        if (m.Content == "-solve") {
 | 
						|
            if (m.MessageReference == nil) {
 | 
						|
                s.ChannelMessageSendReply(m.ChannelID, "Please reply to a message with a maze", m.Reference())
 | 
						|
            } else {
 | 
						|
                reply, err := s.ChannelMessage(m.MessageReference.ChannelID, m.MessageReference.MessageID)
 | 
						|
                if (err != nil) {
 | 
						|
                    s.ChannelMessageSendReply(m.ChannelID, "Please reply to a message with a maze", m.Reference())
 | 
						|
                } else {
 | 
						|
                    if (len(reply.Attachments) < 1) {
 | 
						|
                        s.ChannelMessageSendReply(m.ChannelID, "Reply does not contain a maze", m.Reference())
 | 
						|
                    } else if (len(reply.Attachments) > 1) {
 | 
						|
                        s.ChannelMessageSendReply(m.ChannelID, "Too many images!", m.Reference())
 | 
						|
                    } else {
 | 
						|
                        maze, err := getMaze.GetMaze(reply.Attachments[0].URL)
 | 
						|
                        if (err != nil) {
 | 
						|
                            s.ChannelMessageSendReply(m.ChannelID, "Send a valid maze", m.Reference())
 | 
						|
                        } else {
 | 
						|
                            points := solvemaze.FindPath(maze)
 | 
						|
                            _, err := outputmaze.EditMaze(points, "/tmp/maze.png", "/tmp/outputmaze.png")
 | 
						|
                            if err != nil {
 | 
						|
                                s.ChannelMessageSendReply(m.ChannelID, "server error", m.Reference())
 | 
						|
                            }
 | 
						|
                            maze = nil
 | 
						|
                            points = nil
 | 
						|
                            f, _ := os.Open("/tmp/outputmaze.png")
 | 
						|
                            _, err = s.ChannelMessageSendComplex(m.ChannelID, &discordgo.MessageSend{
 | 
						|
                                Files: []*discordgo.File{
 | 
						|
                                    {
 | 
						|
                                        Name: "/tmp/outputmaze.png",
 | 
						|
                                        Reader: f,
 | 
						|
                                    },
 | 
						|
                                },
 | 
						|
                                Reference: &discordgo.MessageReference{
 | 
						|
                                    MessageID: m.Reference().MessageID,
 | 
						|
                                    ChannelID: m.Reference().ChannelID,
 | 
						|
                                    GuildID: m.Reference().GuildID,
 | 
						|
                                },
 | 
						|
                            })
 | 
						|
                            if err != nil {
 | 
						|
                                fmt.Println(err)
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    })
 | 
						|
 | 
						|
    err = discord.Open()
 | 
						|
    if err != nil { log.Fatal(err) }
 | 
						|
 | 
						|
    stop := make (chan os.Signal, 1)
 | 
						|
    signal.Notify(stop, os.Interrupt)
 | 
						|
    log.Println("Press Ctrl+C to Exit")
 | 
						|
    <-stop
 | 
						|
 | 
						|
    err = discord.Close()
 | 
						|
    if err != nil { log.Fatal(err) }
 | 
						|
}
 | 
						|
 | 
						|
func parseMessageLink(link string) (string, string, string, error) {
 | 
						|
	parts := strings.Split(link, "/")
 | 
						|
	if len(parts) < 7 {
 | 
						|
		return "", "", "", fmt.Errorf("invalid message link format")
 | 
						|
	}
 | 
						|
	guildID := parts[4]
 | 
						|
	channelID := parts[5]
 | 
						|
	messageID := parts[6]
 | 
						|
	return guildID, channelID, messageID, nil
 | 
						|
}
 |