Реализовал регистрацию в Телергафе
This commit is contained in:
parent
e178956020
commit
492ddf74a1
1 changed files with 168 additions and 7 deletions
|
@ -3,19 +3,180 @@ package main
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"log"
|
"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() {
|
func init() {
|
||||||
flag.StringVar(&Token, "token", "", "Authorization token to Discord API for bots")
|
|
||||||
flag.Parse()
|
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()
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue