package main
import (
"bufio"
"fmt"
"log"
"os"
"strconv"
)
//SelectPrivateMenu is a menu item that changes to a private channel
func SelectPrivateMenu() {
Start:
Msg(InfoMsg, "Select a Member:\n")
// List of PMs
UserChannels, err := Session.DiscordGo.UserChannels()
if err != nil {
Msg(ErrorMsg, "No Private Channels\n")
}
UserMap := make(map[int]string)
SelectID := 0
for _, user := range UserChannels {
UserMap[SelectID] = user.ID
// We have to loop through all recipients
recipients := UserChannels[SelectID].Recipients
for _, recipient := range recipients {
if recipient.ID == user.ID {
continue
}
if recipient.Username == "" {
continue
}
Msg(TextMsg, "[%d] %s\n", SelectID, recipient.Username)
break
}
SelectID++
}
Msg(TextMsg, "[b] Extra Options\n")
var response string
fmt.Scanf("%s\n", &response)
ResponseInteger, err := strconv.Atoi(response)
if response == "b" {
New:
Msg(InfoMsg, "Extra Options:\n")
Msg(TextMsg, "[n] Join New User Channel\n")
Msg(TextMsg, "[d] Leave User Channel\n")
Msg(TextMsg, "[b] Go Back\n")
var response string
fmt.Scanf("%s\n", &response)
switch response {
case "n":
if State.Channel != nil {
AddUserChannel()
ShowEmptyContent()
goto End
} else {
Msg(ErrorMsg, "Join a guild before attempting to join a user channel\n")
goto New
}
case "d":
SelectDeletePrivate()
goto Start
case "b":
goto Start
default:
goto New
}
}
if err != nil {
Msg(ErrorMsg, "(GU) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(GU) Error: ID is out of bounds\n")
goto Start
}
State.Channel = UserChannels[ResponseInteger]
End:
}
//SelectDeletePrivateMenu deletes a user channel
func SelectDeletePrivateMenu() {
Start:
Msg(InfoMsg, "Select a Member:\n")
UserChannels, err := Session.DiscordGo.UserChannels()
if err != nil {
Msg(ErrorMsg, "No Private Channels\n")
}
UserMap := make(map[int]string)
SelectID := 0
for _, user := range UserChannels {
UserMap[SelectID] = user.ID
// We have to loop through all recipients
recipients := UserChannels[SelectID].Recipients
for _, recipient := range recipients {
if recipient.ID == user.ID {
continue
}
if recipient.Username == "" {
continue
}
Msg(TextMsg, "[%d] %s\n", SelectID, recipient.Username)
break
}
SelectID++
}
var response string
fmt.Scanf("%s\n", &response)
ResponseInteger, err := strconv.Atoi(response)
if err != nil {
Msg(ErrorMsg, "(GU) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(GU) Error: ID is out of bounds\n")
goto Start
}
Session.DiscordGo.ChannelDelete(UserChannels[ResponseInteger].ID)
}
//SelectGuildMenu is a menu item that creates a new State on basis of Guild selection
func SelectGuildMenu() {
var err error
Start:
Msg(InfoMsg, "Select a Guild:\n")
SelectMap := make(map[int]string)
SelectID := 0
for _, guild := range Session.Guilds {
SelectMap[SelectID] = guild.ID
Msg(TextMsg, "[%d] %s\n", SelectID, guild.Name)
SelectID++
}
Msg(TextMsg, "[b] Extra Options\n")
Msg(TextMsg, "[p] Private Channels\n")
var response string
fmt.Scanf("%s\n", &response)
ResponseInteger, err := strconv.Atoi(response)
if response == "b" {
ExtraGuildMenuOptions()
goto Start
}
if response == "p" {
if State != nil {
SelectPrivate()
} else {
State, err = Session.NewState(SelectMap[0], Config.Messages)
if err != nil {
log.Fatal(err)
}
SelectPrivate()
}
} else {
if err != nil {
Msg(ErrorMsg, "(GU) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(GU) Error: ID is out of bounds\n")
goto Start
}
State, err = Session.NewState(SelectMap[ResponseInteger], Config.Messages)
if err != nil {
log.Fatal(err)
}
}
}
//SelectChannelMenu is a menu item that sets the current channel
func SelectChannelMenu() {
Start:
Msg(InfoMsg, "Select a Channel:\n")
SelectMap := make(map[int]string)
SelectID := 0
for _, channel := range State.Channels {
// 0 is ChannelTypeGuildText ChannelType = iota
if channel.Type == 0 {
SelectMap[SelectID] = channel.ID
Msg(TextMsg, "[%d] %s\n", SelectID, channel.Name)
SelectID++
}
}
Msg(TextMsg, "[b] Go Back\n")
var response string
fmt.Scanf("%s\n", &response)
if response == "b" {
SelectGuildMenu()
goto Start
}
ResponseInteger, err := strconv.Atoi(response)
if err != nil {
Msg(ErrorMsg, "(CH) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(CH) Error: ID is out of bound\n")
goto Start
}
State.SetChannel(SelectMap[ResponseInteger])
}
//ExtraGuildMenuOptions prints and handles extra options for SelectGuildMenu
func ExtraGuildMenuOptions() {
Start:
Msg(InfoMsg, "Extra Options:\n")
Msg(TextMsg, "[n] Join New Server\n")
Msg(TextMsg, "[d] Leave Server\n")
Msg(TextMsg, "[o] Join Official 9fans Server\n")
Msg(TextMsg, "[b] Go Back\n")
var response string
fmt.Scanf("%s\n", &response)
switch response {
case "n":
New:
Msg(TextMsg, "Please input invite number ([b] back):\n")
fmt.Scanf("%s\n", &response)
if response == "b" {
goto Start
}
Invite, err := Session.DiscordGo.Invite(response)
if err != nil {
Msg(ErrorMsg, "Invalid Invite\n")
goto New
}
Msg(TextMsg, "Join %s ? [y/n]: ", Invite.Guild.Name)
reader := bufio.NewReader(os.Stdin)
response, _ := reader.ReadString('\n')
response = response[:len(response)-1]
fmt.Println(response, " ", len(response))
//fmt.Scanf("%s\n", &response)
if response == "y" {
Session.DiscordGo.InviteAccept(Invite.Code)
err := Session.Update()
if err != nil {
Msg(ErrorMsg, "Session Update Failed: %s\n", err)
}
} else {
goto Start
}
case "o":
_, err := Session.DiscordGo.InviteAccept("https://discord.gg/6daut5T")
if err != nil {
Msg(ErrorMsg, "Joining Official 9fans Server failed\n")
goto Start
}
Msg(InfoMsg, "Joined Official 9fans Server!\n")
case "d":
LeaveServerMenu()
goto Start
default:
return
}
return
}
//ExtraPrivateMenuOptions adds functionality to UserChannels.
func ExtraPrivateMenuOptions() {
return
}
//AddUserChannelMenu takes a user from the current guild and adds them to a private message. WILL RETURN ERROR IF IN USER CHANNEL.
func AddUserChannelMenu() {
if State.Channel.GuildID == "" {
Msg(ErrorMsg, "Currently in a user channel, move to a guild with :g\n")
} else {
SelectMap := make(map[int]string)
Start:
SelectID := 0
for _, Member := range State.Members {
SelectMap[SelectID] = Member.User.ID
Msg(TextMsg, "[%d] %s\n", SelectID, Member.User.Username)
SelectID++
}
var response string
fmt.Scanf("%s\n", &response)
if response == "b" {
return
}
ResponseInteger, err := strconv.Atoi(response)
if err != nil {
Msg(ErrorMsg, "(CH) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(CH) Error: ID is out of bound\n")
goto Start
}
Chan, err := Session.DiscordGo.UserChannelCreate(SelectMap[ResponseInteger])
if Chan.LastMessageID == "" {
var firstMessage string
fmt.Scanf("%s\n", &firstMessage)
Session.DiscordGo.ChannelMessageSend(Chan.ID, "Test")
}
State.Channel = Chan
}
}
//LeaveServerMenu is a copy of SelectGuildMenu that leaves instead of selects
func LeaveServerMenu() {
var err error
Start:
Msg(InfoMsg, "Leave a Guild:\n")
SelectMap := make(map[int]string)
SelectID := 0
for _, guild := range Session.Guilds {
SelectMap[SelectID] = guild.ID
Msg(TextMsg, "[%d] %s\n", SelectID, guild.Name)
SelectID++
}
Msg(TextMsg, "[b] Go Back\n")
var response string
fmt.Scanf("%s\n", &response)
if response == "b" {
return
}
ResponseInteger, err := strconv.Atoi(response)
if err != nil {
Msg(ErrorMsg, "(GUD) Conversion Error: %s\n", err)
goto Start
}
if ResponseInteger > SelectID-1 || ResponseInteger < 0 {
Msg(ErrorMsg, "(GUD) Error: ID is out of bounds\n")
goto Start
}
Guild, err := Session.DiscordGo.Guild(SelectMap[ResponseInteger])
if err != nil {
Msg(ErrorMsg, "(GUD) Unknown Error: %s\n", err)
goto Start
}
Msg(TextMsg, "Leave %s ? [y/n]:\n", Guild.Name)
fmt.Scanf("%s\n", &response)
if response == "y" {
Session.DiscordGo.GuildLeave(Guild.ID)
err := Session.Update()
if err != nil {
Msg(ErrorMsg, "Session Update Failed: %s\n", err)
}
} else {
goto Start
}
}