Реализовал регистрацию в Телергафе
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 (
|
||||
"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()
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue