From 492ddf74a19b8a95c0e2d16b44d52c21cd10094c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=97=D0=B0=D0=B6=D0=B8=D0=B3=D0=B8=D0=BD=20=D0=91=D0=BE?= =?UTF-8?q?=D0=B3=D0=B4=D0=B0=D0=BD=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Sun, 14 May 2023 20:58:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B2=20=D0=A2=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D1=80=D0=B3=D0=B0=D1=84=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/discord-telegraph/main.go | 175 +++++++++++++++++++++++++++++-- 1 file changed, 168 insertions(+), 7 deletions(-) diff --git a/source/discord-telegraph/main.go b/source/discord-telegraph/main.go index b06500f..659aa89 100644 --- a/source/discord-telegraph/main.go +++ b/source/discord-telegraph/main.go @@ -3,19 +3,180 @@ package main import ( "flag" "log" + "os" + "os/signal" + + telegraph "github.com/anonyindian/telegraph-go" + discord "github.com/bwmarrin/discordgo" ) -// Token — токен авторизации к АПИ Дискорда для ботов -var Token string +// Определение параметров запуска и их получение +var ( + GuildID = flag.String("guild", "", "Test guild ID. If not passed — bot registers commands globally") + BotToken = flag.String("token", "", "Authorization token to the Discord API for bots") + RemoveCommands = flag.Bool("clean", true, "Remove all commands after shutdown or not") +) -// Получение аргументов к запуску func init() { - flag.StringVar(&Token, "token", "", "Authorization token to Discord API for bots") flag.Parse() } -func main() { - log.Println("Got the token:", Token) +// Создание и подключение сессии к ППИ Дискорда +var session *discord.Session + +func init() { + var creationError error + session, creationError = discord.New("Bot " + *BotToken) + if creationError != nil { + log.Fatalf("The token is invalid: %v", creationError) + } } -// TODO: Создать и зарегстрировать команду, которая регистрирует аккаунт на Телеграфе. Здесь нужна ключ-значение БД. +// commands — упорядоченный список комманд класса «ApplicationCommands», +var commands = []*discord.ApplicationCommand{ + { // Команда регистрации в Телеграфе + Name: "register", + NameLocalizations: &map[discord.Locale]string{ + discord.Russian: "зарегистрировать", + }, + Description: "Register an account", + DescriptionLocalizations: &map[discord.Locale]string{ + discord.Russian: "Зарегестрировать аккаунт на Телеграфе", + }, + Options: []*discord.ApplicationCommandOption{ + { + Required: true, + Type: discord.ApplicationCommandOptionString, + Name: "login", + NameLocalizations: map[discord.Locale]string{ + discord.Russian: "логин", + }, + Description: "Login name to be logged as into your account", + DescriptionLocalizations: map[discord.Locale]string{ + discord.Russian: "Регистрационное имя пользователя для создания «автора» и публикаций", + }, + }, + }, + }, +} + +// commandHandlers — словарь «название команды — функция (колбэк) используящая сессию и создание интеракции» +var commandHandlers = map[string]func(session *discord.Session, interaction *discord.InteractionCreate){ + "register": func(session *discord.Session, interaction *discord.InteractionCreate) { + shortname := interaction.ApplicationCommandData().Options[0].StringValue() + account, _ := telegraph.CreateAccount(shortname, nil) + switch interaction.Locale { + default: + session.InteractionRespond(interaction.Interaction, &discord.InteractionResponse{ + Type: discord.InteractionResponseChannelMessageWithSource, + Data: &discord.InteractionResponseData{ + Embeds: []*discord.MessageEmbed{ + { + Title: "User \"" + account.ShortName + "\" successfully created", + Description: "The token is `" + account.AccessToken + "`.", + }, + }, + Flags: discord.MessageFlagsEphemeral, + Components: []discord.MessageComponent{ + discord.ActionsRow{ + Components: []discord.MessageComponent{ + discord.Button{ + Style: discord.LinkButton, + URL: account.AuthUrl, + Label: "Write an article in the web-editor", + }, + }, + }, + }, + }, + }) + case discord.Russian: + session.InteractionRespond(interaction.Interaction, &discord.InteractionResponse{ + Type: discord.InteractionResponseChannelMessageWithSource, + Data: &discord.InteractionResponseData{ + Embeds: []*discord.MessageEmbed{ + { + Title: "Пользователь " + account.ShortName + " создан", + Description: "Токен доступа — `" + account.AccessToken + "`.", + }, + }, + Flags: discord.MessageFlagsEphemeral, + Components: []discord.MessageComponent{ + discord.ActionsRow{ + Components: []discord.MessageComponent{ + discord.Button{ + Style: discord.LinkButton, + URL: account.AuthUrl, + Label: "Перейти в веб-редактор", + }, + }, + }, + }, + }, + }) + } + + }, +} + +// Со строки 77 идёт регистрация комманд, после каждой успешной регистрации +// название команды привязывается к её колбэку. +func init() { + session.AddHandler(func(session *discord.Session, commandCreation *discord.InteractionCreate) { + if callback, ok := commandHandlers[commandCreation.ApplicationCommandData().Name]; ok { + callback(session, commandCreation) + } + }) +} + +func main() { + // Ожидание запуска бота и лог результатов запуска + session.AddHandler(func(session *discord.Session, ready *discord.Ready) { + log.Printf("Logged in as: %v#%v", session.State.User.Username, session.State.User.Discriminator) + }) + + // Запуск бота + connectionError := session.Open() + if connectionError != nil { + log.Fatalf("Cannot open the session: %v", connectionError) + } + + // Регистрация интеракций + log.Println("Adding commands...") + registeredCommands := make([]*discord.ApplicationCommand, len(commands)) + for count, command := range commands { + cmd, err := session.ApplicationCommandCreate(session.State.User.ID, *GuildID, command) + if err != nil { + log.Panicf("Cannot create '%v' command: %v", command.Name, err) + } + registeredCommands[count] = cmd + } + + updateError := session.UpdateStatusComplex(discord.UpdateStatusData{Status: "dsa", AFK: false, IdleSince: nil}) + if updateError != nil { + log.Panic("Пиздец") + } else { + log.Println("dsadas") + } + + // Начало канала, ожидающего сигналы системы равного одному, т.е. завершения. + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt) + log.Println("Press Ctrl+C to exit") + <-stop + + // Алгорит далее начнётся только после того как «stop» будет реализован. + if *RemoveCommands { + log.Println("Removing commands...") + for _, v := range registeredCommands { + err := session.ApplicationCommandDelete(session.State.User.ID, *GuildID, v.ID) + if err != nil { + log.Panicf("Cannot delete '%v' command: %v", v.Name, err) + } + } + } + + // По завершению всего остального бот выключится (defer) + log.Println("Gracefully shutting down.") + defer session.Close() +}