Реализовал регистрацию в Телергафе

This commit is contained in:
bogdan zažigin 2023-05-14 20:58:41 +03:00
parent e178956020
commit 492ddf74a1
Signed by: zaboal
GPG key ID: C9918166D559FE8A

View file

@ -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()
}