go: Refactor messageutil.go

master
Luther Wen Xu 2019-10-12 21:49:41 +07:00
parent cc2c90c4e3
commit e181a09b4b
Signed by untrusted user: chanbakjsd
GPG Key ID: B7D77E3E9D102B70
8 changed files with 284 additions and 255 deletions

@ -4,8 +4,33 @@ package config
const UsageTitle = "使用方法Command Usage"
const UsageColour = 0xF00000
const ErrorStack = "纠错信息Debug Info"
const ErrorColour = 0xE00000
const SuccessTitle = "成功Success"
const SuccessColour = 0x00E000
const PermissionErrorTitle = "没有权限Forbidden"
const ErrorCannotFindMember = "请确保你已经加入伺服器。Please make sure that you're in the server."
const ErrorMustNotBeMember = "这个指令不能被会员使用。This command cannot be used by server members."
const ErrorMustBeMember = "这个指令只能在成为会员后使用。This command can only be used by server members."
const ErrorMustDMTitle = "私信保护 DM Protection"
const ErrorMustDMDescription = "<@%s>,这个指令只能在私信中使用。<@%s>, this command can only be used in DMs."
const AuditInfoTitle = "记录Audit Info"
const AuditInfoColour = 0xA0A0A0
const InternalErrorDescription = "发生了不明错误。An unknown error has occurred."
//==Vote==
const VoteErrorTitle = "投票错误Vote Error"
const ErrorForceRejectionReuse = "您在这个月内已使用过:x:。请选择其他选项。\nYou have used :x: this month. Please choose another option."
const ErrorVoteHasEnded = "无法投票给已经结束的投票。\nCannot vote in a vote that has already ended."
const VoteSuccessfulTitle = "投票成功Voted Successfully"
const VoteSuccessfulVoteID = "投票编号Vote ID"
const VoteSuccessfulVoteName = "投票名称Vote Name"
const VoteSuccessfulDetectedVote = "所投的票Your Vote"
const VoteSuggestionNote = "\n备注这个系统即将被一个指令代替。\nNote: This system is going to be replaced by a command soon."
const VoteSuggestionErrorTitle = "开始新的投票错误Vote Suggestion Error"
const ErrorVoteSuggestionNotEnoughInfo = "请提供更多资料。\nPlease provide more information."
const ErrorVoteSuggestionTooLong = "你投票的内容过长了。请使用少过500个字符。\nYour vote is too long. Please use a maximum of 500 characters."
const ErrorVoteSuggestionUnknownType = "未知投票种类Unknown Vote Type: %s"
//==Commands==
const SendAsUsage = "!sendas <频道ID> <信息>\n!sendas <channel ID> <message>"
@ -23,3 +48,11 @@ const VTLSingleUserServerTotal = "伺服器总分 Server Total"
const VTLSingleUserPercentage = "百分比 Percentage"
const VTLGlobalTitle = "伺服器信誉分报告 Server Trust Score Report"
const VTLGlobalFieldFormat = "%.1f/%.1f (%.2f%%)"
const ValidateUsage = "!validate <验证码> <为自己拉票的字>\n!validate <validation code> <reason you should be accepted>"
const ValidateSuccess = "已向验证码制造者发送了请求。\nSent a request to use the validation code to its creator."
const ErrorValidateTitle = "验证错误Validation Error"
const ErrorValidationCodeReuse = "该验证码已被使用过。请向验证码制造者要求新的验证码。\nThis validation code has been used before. Please request a new one from its creator."
const ErrorValidationCodeNotExist = "该验证码不存在。请使用一位会员给你的验证码。\nThis validation code doesn't exist. Please use one given by a member."
const ErrorValidationCodeNotOwnedByMember = "验证码制造者不是会员。\nvalidation code creator is no longer a member."
const ErrorValidationCodeCreatorDisabledPM = "验证码制造者关闭了私信。\nValidation code creator did not enable DMs."

@ -61,3 +61,12 @@ func (e *embed) Build() *discordgo.MessageEmbed {
func (e *embed) Send(s *discordgo.Session, channelID string) {
s.ChannelMessageSendEmbed(channelID, e.Build())
}
func (e *embed) SendPM(s *discordgo.Session, userID string) {
channel, err := s.UserChannelCreate(userID)
if err != nil {
auditError(s, "", err)
return
}
e.Send(s, channel.ID)
}

@ -2,7 +2,6 @@ package modules
import (
"fmt"
"strings"
"github.com/bwmarrin/discordgo"
@ -17,120 +16,110 @@ type invite struct {
Reason string
}
func createInvite(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if !enforceDM(s, m) {
return
}
if !membersOnly(s, m) {
return
}
if len(command) < 2 {
s.ChannelMessageSend(m.ChannelID, "指令的使用方法是`!invite <你所要设置的验证码>`.\nUsage: `!invite <validation code>`")
return
}
if len(command) > 2 {
s.ChannelMessageSend(m.ChannelID, "所提供的验证码不得有任何空格。\nThe provided validation code cannot contain any spaces.")
return
}
var createInvite = enforceDM(memberFilter(true,
func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if len(command) < 2 {
s.ChannelMessageSend(m.ChannelID, "指令的使用方法是`!invite <你所要设置的验证码>`.\nUsage: `!invite <validation code>`")
return
}
if len(command) > 2 {
s.ChannelMessageSend(m.ChannelID, "所提供的验证码不得有任何空格。\nThe provided validation code cannot contain any spaces.")
return
}
err := db.SetInviteOwner(command[1], m.Author.ID)
switch err {
case db.ErrAlreadyExists:
owner, _ := db.GetInviteOwner(command[1])
if owner == m.Author.ID {
err := db.SetInviteOwner(command[1], m.Author.ID)
switch err {
case db.ErrAlreadyExists:
owner, _ := db.GetInviteOwner(command[1])
if owner == m.Author.ID {
s.ChannelMessageSend(
m.ChannelID,
"这个验证码归你所有,它仍然未被使用。请把它告诉你要邀请的人。\nThis validation code belongs to you. Please give it to the person you want to invite.",
)
return
}
s.ChannelMessageSend(
m.ChannelID,
"这个验证码已被其他会员注册。请使用别的验证码。\nThis validation code is already registered. Please try another one.",
)
case db.ErrInviteUsed:
s.ChannelMessageSend(
m.ChannelID,
"这个验证码已被使用。请使用别的验证码。\nThis validation code has already been used. Please try another one.",
)
case nil:
s.ChannelMessageSend(
m.ChannelID,
"这个验证码归你所有,它仍然未被使用。请把它告诉你要邀请的人。\nThis validation code belongs to you. Please give it to the person you want to invite.",
"这个验证码现在属于你了。请好好保管并把它交给你要邀请的人。\nThis validation code now belongs to you! Pass it on to the person you want to invite.",
)
default:
s.ChannelMessageSend(
m.ChannelID,
"不明错误已发生,请把这个错误信息发在群里。\nAn unknown error has occurred. Please pass this error message on.\n"+err.Error(),
)
}
},
))
var checkUseInvite = enforceDM(memberFilter(false, enforceArgumentCount(
config.ValidateUsage, 3,
func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
inviter, err := db.GetInviteOwner(command[1])
if err == db.ErrInviteUsed {
initNewEmbed(config.ErrorValidateTitle, config.ErrorValidationCodeReuse, config.ErrorColour).
Send(s, m.ChannelID)
return
}
if err == db.ErrNotFound {
initNewEmbed(config.ErrorValidateTitle, config.ErrorValidationCodeNotExist, config.ErrorColour).
SendPM(s, m.ChannelID)
return
}
if err != nil {
auditError(s, m.ChannelID, err)
return
}
s.ChannelMessageSend(
m.ChannelID,
"这个验证码已被其他会员注册。请使用别的验证码。\nThis validation code is already registered. Please try another one.",
)
case db.ErrInviteUsed:
s.ChannelMessageSend(
m.ChannelID,
"这个验证码已被使用。请使用别的验证码。\nThis validation code has already been used. Please try another one.",
)
case nil:
s.ChannelMessageSend(
m.ChannelID,
"这个验证码现在属于你了。请好好保管并把它交给你要邀请的人。\nThis validation code now belongs to you! Pass it on to the person you want to invite.",
)
default:
s.ChannelMessageSend(
m.ChannelID,
"不明错误已发生,请把这个错误信息发在群里。\nAn unknown error has occurred. Please pass this error message on.\n"+err.Error(),
)
}
}
func checkUseInvite(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if !enforceDM(s, m) {
return
}
if !nonMembersOnly(s, m) {
return
}
s.ChannelMessageDelete(m.ChannelID, m.ID)
if len(command) < 3 {
sendPrivateMessage(s, m.Author.ID, "指令的使用方法是`!validate <验证码> <原因>`.\nUsage: `!validate <validation code> <reason>`")
return
}
messageSplit := strings.SplitN(m.Content, " ", 3)
inviter, err := db.GetInviteOwner(messageSplit[1])
if err == db.ErrInviteUsed {
sendPrivateMessage(s, m.Author.ID, "该验证码已被使用过。请向验证码制造者要求新的验证码。\nThis validation code has been used before. Please request a new one.")
return
}
if err == db.ErrNotFound {
sendPrivateMessage(s, m.Author.ID, "该验证码不存在。请使用存在的验证码。\nThis validation code doesn't exist. Please use an existing one.")
return
}
if err != nil {
sendPrivateMessage(s, m.Author.ID, "错误已发生。请稍候尝试。\nAn error has occurred. Please try again later.")
auditLog(s, err.Error())
return
}
db.UseInvite(messageSplit[1])
member, err := s.GuildMember(config.GuildID, inviter)
if err != nil {
sendPrivateMessage(s, m.Author.ID, "验证码制造者不是会员。\nValidation code creator is no longer a member.")
return
}
db.UseInvite(command[1])
member, err := s.GuildMember(config.GuildID, inviter)
if err != nil {
auditErrorPM(s, m.ChannelID, err)
return
}
isMember := false
for _, v := range member.Roles {
if v == config.MemberRoleID {
isMember = true
isMember := false
for _, v := range member.Roles {
if v == config.MemberRoleID {
isMember = true
}
}
if !isMember {
initNewEmbed(config.ErrorValidateTitle, config.ErrorValidationCodeNotOwnedByMember, config.ErrorColour).
SendPM(s, m.ChannelID)
return
}
}
if !isMember {
sendPrivateMessage(s, m.Author.ID, "验证码制造者不是会员。\nValidation code creator is no longer a member.")
return
}
channel, err := s.UserChannelCreate(inviter)
if err != nil {
sendPrivateMessage(s, m.Author.ID, "验证码制造者关闭了私信。\nValidation code creator did not enable DMs.")
return
}
msg, err := s.ChannelMessageSend(channel.ID, fmt.Sprintf("<@%s>正在尝试使用验证码%s。请问是否同意该使用", m.Author.ID, messageSplit[1]))
if err != nil {
sendPrivateMessage(s, m.Author.ID, "验证码制造者关闭了私信。\nValidation code creator did not enable DMs.")
return
}
pendingInviteConfirmation[msg.ID] = invite{
User: m.Author.ID,
Reason: messageSplit[2],
}
s.MessageReactionAdd(channel.ID, msg.ID, emojiX)
s.MessageReactionAdd(channel.ID, msg.ID, emojiCheck)
sendPrivateMessage(s, m.Author.ID, "已向验证码制造者发送了请求。\nSent a request to use the validation code to its creator.")
}
channel, err := s.UserChannelCreate(inviter)
if err != nil {
initNewEmbed(config.ErrorValidateTitle, config.ErrorValidationCodeCreatorDisabledPM, config.ErrorColour).
SendPM(s, m.ChannelID)
return
}
msg, err := s.ChannelMessageSend(channel.ID, fmt.Sprintf("<@%s>正在尝试使用验证码%s。请问是否同意该使用", m.Author.ID, command[1]))
if err != nil {
auditErrorPM(s, m.ChannelID, err)
return
}
pendingInviteConfirmation[msg.ID] = invite{
User: m.Author.ID,
Reason: command[2],
}
s.MessageReactionAdd(channel.ID, msg.ID, emojiX)
s.MessageReactionAdd(channel.ID, msg.ID, emojiCheck)
initNewEmbed(config.SuccessTitle, config.ValidateSuccess, config.SuccessColour).
SendPM(s, m.ChannelID)
},
)))
func CheckForInvite(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
if r.UserID == s.State.User.ID {
@ -156,21 +145,15 @@ func CheckForInvite(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
msg, err := s.ChannelMessageSend(config.VoteChannel, "正在准备新的一个投票…… Preparing for the next vote...")
if err != nil {
sendPrivateMessage(s, r.UserID, "创造投票失败。Failed to create vote.")
auditLog(s,
fmt.Sprintf("Error occurred while creating vote for <@%s>.\n%v\nError: %s", r.UserID, *r, err.Error()),
)
auditErrorPM(s, r.UserID, err)
return
}
id, err := db.CreateInviteVote(msg.ID, invite.User, invite.Reason)
if err != nil {
sendPrivateMessage(s, r.UserID, "创造投票失败。Failed to create vote.")
auditLog(s,
fmt.Sprintf("Error occurred while creating vote for <@%s>.\n%v\nError: %s", r.UserID, *r, err.Error()),
)
auditErrorPM(s, r.UserID, err)
return
}
auditLog(s, fmt.Sprintf("Vote ID %d has been created by <@%s>.", id, r.UserID))
auditInfo(s, fmt.Sprintf("Vote ID %d has been created by <@%s>.", id, r.UserID))
s.ChannelMessageEdit(config.VoteChannel, msg.ID, "")
s.ChannelMessageEditEmbed(config.VoteChannel, msg.ID, createInviteEmbed(id, invite.User+":"+invite.Reason))
s.MessageReactionAdd(config.VoteChannel, msg.ID, emojiX)

@ -11,82 +11,55 @@ import (
"TerraOceanBot/discord/config"
)
func enforceDM(s *discordgo.Session, m *discordgo.MessageCreate) bool {
if m.GuildID != "" {
//This command can only be used in DM to protect the invite creator.
s.ChannelMessageDelete(m.ChannelID, m.ID)
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",这个指令只能在私信中使用。\n"+m.Author.Mention()+", this command can only be used in DM.",
)
return false
}
return true
}
func membersOnly(s *discordgo.Session, m *discordgo.MessageCreate) bool {
member, err := s.GuildMember(config.GuildID, m.Author.ID)
if err != nil {
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",请在成为会员后才使用这个指令。\n"+m.Author.Mention()+", please use this command after you become a member.",
)
return false
}
for _, v := range member.Roles {
if v == config.MemberRoleID {
return true
func enforceDM(passOn CommandHandler) CommandHandler {
return func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if m.GuildID != "" {
//This command can only be used in DM to protect the invite creator.
s.ChannelMessageDelete(m.ChannelID, m.ID)
initNewEmbed(
config.ErrorMustDMTitle,
fmt.Sprintf(config.ErrorMustDMDescription, m.Author.ID, m.Author.ID),
config.ErrorColour,
).Send(s, m.ChannelID)
return
}
passOn(s, m, command)
}
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",请在成为会员后才使用这个指令。\n"+m.Author.Mention()+", please use this command after you become a member.",
)
return false
}
func nonMembersOnly(s *discordgo.Session, m *discordgo.MessageCreate) bool {
member, err := s.GuildMember(config.GuildID, m.Author.ID)
if err != nil {
return false
}
for _, v := range member.Roles {
if v == config.MemberRoleID {
s.ChannelMessageSend(
m.ChannelID,
m.Author.Mention()+",该指令只能被非会员使用。\n"+m.Author.Mention()+", this command can only be used by non-member.",
)
return false
func memberFilter(mustBeMember bool, passOn CommandHandler) CommandHandler {
return func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
member, err := s.GuildMember(config.GuildID, m.Author.ID)
if err != nil {
initNewEmbed(config.PermissionErrorTitle, config.ErrorCannotFindMember, config.ErrorColour).
Send(s, m.ChannelID)
return
}
for _, v := range member.Roles {
if v == config.MemberRoleID {
if mustBeMember {
passOn(s, m, command)
} else {
initNewEmbed(config.PermissionErrorTitle, config.ErrorMustNotBeMember, config.ErrorColour).
Send(s, m.ChannelID)
}
return
}
}
if mustBeMember {
initNewEmbed(config.PermissionErrorTitle, config.ErrorMustBeMember, config.ErrorColour).
Send(s, m.ChannelID)
} else {
passOn(s, m, command)
}
}
return true
}
func sendPrivateMessage(s *discordgo.Session, recipient, message string) error {
channel, err := s.UserChannelCreate(recipient)
if err != nil {
return err
}
_, err = s.ChannelMessageSend(channel.ID, message)
return err
}
func auditLog(s *discordgo.Session, message string) {
_, err := s.ChannelMessageSend(config.AuditChannel, message)
if err != nil {
fmt.Println("==Audit Log==")
fmt.Println(message)
fmt.Println(err)
}
}
func enforceArgumentCount(usage string, count int, passOn CommandHandler) CommandHandler {
return func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if len(command) < count {
s.ChannelMessageSendEmbed(
m.ChannelID,
newEmbed().SetTitle(config.UsageTitle).SetDescription(usage).SetColour(config.UsageColour).Build(),
)
initNewEmbed(config.UsageTitle, usage, config.UsageColour).
Send(s, m.ChannelID)
return
}
command[count-1] = strings.Join(command[count-1:], " ")
@ -101,7 +74,32 @@ func sendError(s *discordgo.Session, channelID string, err error) {
if count == 512 {
stack += "..."
}
initNewErrorEmbed(err.Error()).AddField(config.ErrorStack, stack).Send(s, channelID)
initNewErrorEmbed(err.Error()).
AddField(config.ErrorStack, stack).
Send(s, channelID)
}
func auditInfo(s *discordgo.Session, message string) {
initNewEmbed(config.AuditInfoTitle, message, config.AuditInfoColour).
Send(s, config.AuditChannel)
}
func auditError(s *discordgo.Session, sourceChannel string, err error) {
if sourceChannel != "" {
initNewErrorEmbed(config.InternalErrorDescription).
Send(s, sourceChannel)
}
sendError(s, config.AuditChannel, err)
}
func auditErrorPM(s *discordgo.Session, sourceUser string, err error) {
channel, channelErr := s.UserChannelCreate(sourceUser)
if channelErr != nil {
auditError(s, "", channelErr)
auditError(s, "", err)
return
}
auditError(s, channel.ID, err)
}
func formatFloat(n float64, precision int) string {

@ -1,7 +1,6 @@
package modules
import (
"fmt"
"strings"
"github.com/bwmarrin/discordgo"
@ -12,46 +11,42 @@ import (
var trustMessage = make(map[string]string)
func changeTrust(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if !enforceDM(s, m) {
return
}
if !membersOnly(s, m) {
return
}
if len(command) < 2 {
s.ChannelMessageSend(m.ChannelID, "指令的使用方法是`!trust <你要改信任度的人>`.\nUsage: `!trust <the user>`")
return
}
member, err := backend.GetMemberFromUserFriendlyName(s, strings.SplitN(m.Content, " ", 2)[1])
if err == backend.ErrMemberNotFound {
s.ChannelMessageSend(m.ChannelID, "无法找到您所要求的玩家。\nCannot find the requested player.")
return
}
if err != nil {
auditLog(s, fmt.Sprintf("Error while processing change trust request for <@%s>: %s", m.Author.ID, err.Error()))
return
}
message, err := s.ChannelMessageSendEmbed(
m.ChannelID,
createTrustEmbed(member.User.Username+"#"+member.User.Discriminator, member.Nick),
)
if err != nil {
auditLog(s, fmt.Sprintf("Error while sending change trust request for <@%s>: %s", m.Author.ID, err.Error()))
return
}
trustMessage[message.ID] = member.User.ID
s.MessageReactionAdd(m.ChannelID, message.ID, emojiOne)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiTwo)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiThree)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiFour)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiFive)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiCheck)
}
var changeTrust = enforceDM(memberFilter(true,
func(s *discordgo.Session, m *discordgo.MessageCreate, command []string) {
if len(command) < 2 {
s.ChannelMessageSend(m.ChannelID, "指令的使用方法是`!trust <你要改信任度的人>`.\nUsage: `!trust <the user>`")
return
}
member, err := backend.GetMemberFromUserFriendlyName(s, strings.SplitN(m.Content, " ", 2)[1])
if err == backend.ErrMemberNotFound {
s.ChannelMessageSend(m.ChannelID, "无法找到您所要求的玩家。\nCannot find the requested player.")
return
}
if err != nil {
auditError(s, m.ChannelID, err)
return
}
message, err := s.ChannelMessageSendEmbed(
m.ChannelID,
createTrustEmbed(member.User.Username+"#"+member.User.Discriminator, member.Nick),
)
if err != nil {
auditError(s, m.ChannelID, err)
return
}
trustMessage[message.ID] = member.User.ID
s.MessageReactionAdd(m.ChannelID, message.ID, emojiOne)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiTwo)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiThree)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiFour)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiFive)
s.MessageReactionAdd(m.ChannelID, message.ID, emojiCheck)
},
))
func createTrustEmbed(username, nick string) *discordgo.MessageEmbed {
embed := newEmbed().SetColour(0x00FFFF).SetTitle("更新玩家评分Update Player Score").AddField("ID", username)
@ -89,7 +84,7 @@ func CheckForTrustUpdate(s *discordgo.Session, r *discordgo.MessageReactionAdd)
case emojiCheck:
value = db.NuclearOptionVote
default:
auditLog(s, "Reaction "+r.Emoji.Name+" was added to trust message ID "+r.MessageID)
auditInfo(s, "Reaction "+r.Emoji.Name+" was added to trust message ID "+r.MessageID)
return
}
@ -99,7 +94,7 @@ func CheckForTrustUpdate(s *discordgo.Session, r *discordgo.MessageReactionAdd)
return
}
if err != nil {
auditLog(s, fmt.Sprintf("Error while changing the trust value for <@%s> with target <@%s>: %s", r.UserID, target, err.Error()))
auditError(s, r.ChannelID, err)
return
}

@ -46,7 +46,7 @@ func CheckForVote(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
return
}
if err != nil {
auditLog(s, "Error while checking for vote: "+err.Error())
auditError(s, r.ChannelID, err)
return
}
@ -69,18 +69,20 @@ func CheckForVote(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
case emojiCheck:
value = db.NuclearOptionVote
default:
auditLog(s, "Reaction "+r.Emoji.Name+" was added to vote #"+strconv.Itoa(voteID))
auditInfo(s, "Reaction "+r.Emoji.Name+" was added to vote #"+strconv.Itoa(voteID))
return
}
err = db.UpdateVote(voteID, r.UserID, value)
if err == db.ErrForceRejectionVoteReuse {
sendPrivateMessage(s, r.UserID, "您在这个月内已使用过:x:。请选择其他选项。\nYou have used :x: this month. Please choose another option.")
initNewEmbed(config.VoteErrorTitle, config.ErrorForceRejectionReuse, config.ErrorColour).
SendPM(s, r.UserID)
return
}
if err == db.ErrVoteIsOver {
sendPrivateMessage(s, r.UserID, "这个投票已结束。你投的票没有被记录。\nThe vote is over so your vote is not recorded.")
initNewEmbed(config.VoteErrorTitle, config.ErrorVoteHasEnded, config.ErrorColour).
SendPM(s, r.UserID)
return
}
@ -90,29 +92,39 @@ func CheckForVote(s *discordgo.Session, r *discordgo.MessageReactionAdd) {
}
if err != nil {
sendPrivateMessage(s, r.UserID, "一个错误已发生,请重新尝试。\nAn error has occurred while voting. Please try again.")
auditLog(s,
fmt.Sprintf("Error occurred while processing vote for <@%s>.\n%v\nError: %s", r.UserID, *r, err.Error()),
)
auditErrorPM(s, r.UserID, err)
return
}
sendPrivateMessage(s, r.UserID, "您投票已成功。\nYou have voted successfully.\n名字Vote Name: "+voteName+"\n目前投的票 :"+r.Emoji.Name+":")
auditLog(s, fmt.Sprintf("<@%s> has chosen %s for vote ID %d.", r.UserID, r.Emoji.Name, voteID))
initNewEmbed(config.VoteSuccessfulTitle, "", config.SuccessColour).
AddField(config.VoteSuccessfulVoteID, strconv.Itoa(voteID)).
AddField(config.VoteSuccessfulVoteName, voteName).
AddField(config.VoteSuccessfulDetectedVote, r.Emoji.Name).
SendPM(s, r.UserID)
auditInfo(s, fmt.Sprintf("<@%s> has chosen %s for vote ID %d.", r.UserID, r.Emoji.Name, voteID))
checkForVoteResult(s, voteID)
}
//TODO Replace with a command.
func VoteSuggestion(s *discordgo.Session, m *discordgo.MessageCreate) {
s.ChannelMessageDelete(m.ChannelID, m.ID)
args := strings.SplitN(m.Content, " ", 2)
if len(args) == 1 {
sendPrivateMessage(s, m.Author.ID, "请提供更多资料。\nPlease provide more information.")
initNewEmbed(
config.VoteSuggestionErrorTitle,
config.ErrorVoteSuggestionNotEnoughInfo+config.VoteSuggestionNote,
config.ErrorColour,
).SendPM(s, m.Author.ID)
return
}
if len(args[1]) > 500 {
sendPrivateMessage(s, m.Author.ID, "你投票的内容过长了。请使用少过500个字符。\nYour vote is too long. Please use a maximum of 500 characters.")
initNewEmbed(
config.VoteSuggestionErrorTitle,
config.ErrorVoteSuggestionTooLong+config.VoteSuggestionNote,
config.ErrorColour,
).SendPM(s, m.Author.ID)
return
}
@ -120,21 +132,15 @@ func VoteSuggestion(s *discordgo.Session, m *discordgo.MessageCreate) {
case "custom":
msg, err := s.ChannelMessageSend(config.VoteChannel, "正在准备新的一个投票…… Preparing for the next vote...")
if err != nil {
sendPrivateMessage(s, m.Author.ID, "创造投票失败。Failed to create vote.")
auditLog(s,
fmt.Sprintf("Error occurred while creating vote for <@%s>.\n%v\nError: %s", m.Author.ID, *m, err.Error()),
)
auditErrorPM(s, m.Author.ID, err)
return
}
id, err := db.CreateCustomVote(msg.ID, args[1])
if err != nil {
sendPrivateMessage(s, m.Author.ID, "创造投票失败。Failed to create vote.")
auditLog(s,
fmt.Sprintf("Error occurred while creating vote for <@%s>.\n%v\nError: %s", m.Author.ID, *m, err.Error()),
)
auditErrorPM(s, m.Author.ID, err)
return
}
auditLog(s, fmt.Sprintf("Vote ID %d has been created by <@%s>.", id, m.Author.ID))
auditInfo(s, fmt.Sprintf("Vote ID %d has been created by <@%s>.", id, m.Author.ID))
s.ChannelMessageEdit(config.VoteChannel, msg.ID, "")
s.ChannelMessageEditEmbed(config.VoteChannel, msg.ID, createCustomEmbed(id, args[1]))
s.MessageReactionAdd(config.VoteChannel, msg.ID, emojiOne)
@ -143,7 +149,11 @@ func VoteSuggestion(s *discordgo.Session, m *discordgo.MessageCreate) {
s.MessageReactionAdd(config.VoteChannel, msg.ID, emojiFour)
s.MessageReactionAdd(config.VoteChannel, msg.ID, emojiFive)
default:
sendPrivateMessage(s, m.Author.ID, "未知投票种类:"+args[0]+"\nUnknown vote type: "+args[0])
initNewEmbed(
config.VoteSuggestionErrorTitle,
fmt.Sprintf(config.ErrorVoteSuggestionUnknownType, args[1])+config.VoteSuggestionNote,
config.ErrorColour,
).SendPM(s, m.Author.ID)
}
}

@ -25,18 +25,18 @@ func handleInviteResult(s *discordgo.Session, id int, name string, isPositive bo
}
member, err := backend.GetMemberFromUserFriendlyName(s, strings.SplitN(name, ":", 2)[0])
if err != nil {
auditLog(s, "Error while getting member from user friendly name in invite result. "+err.Error())
auditError(s, "", err)
return
}
err = s.GuildMemberRoleAdd(config.GuildID, member.User.ID, config.MemberRoleID)
if err != nil {
auditLog(s, fmt.Sprintf("Fail to give user <@%s> the member role: %s", member.User.ID, err.Error()))
auditError(s, "", err)
return
}
s.ChannelMessageSend(announceInviteChannel, fmt.Sprintf("欢迎<@%s>的加入Welcome <@%s> to this server!", member.User.ID, member.User.ID))
choices, err := db.GetAllVoteChoices(id)
if err != nil {
auditLog(s, "Error while pulling vote choices. "+err.Error())
auditError(s, "", err)
return
}
for _, choice := range choices {

@ -24,9 +24,10 @@ func ListenToVoteFinishes(s *discordgo.Session) {
for {
voteMutex.Lock()
for _, v := range toAnnounceResultList {
auditLog(s, fmt.Sprintf("Announcing the result of vote %d.", v.VoteID))
auditInfo(s, fmt.Sprintf("Announcing the result of vote %d.", v.VoteID))
if err := db.FinishVote(v.VoteID); err != nil {
auditLog(s, fmt.Sprintf("Error while finishing vote %d.", v.VoteID))
auditError(s, "", err)
continue
}
voteType, _ := db.GetVoteType(v.VoteID)
voteName, _ := db.GetVoteName(v.VoteID)
@ -43,7 +44,7 @@ func ListenToVoteFinishes(s *discordgo.Session) {
func checkForVoteResult(s *discordgo.Session, id int) {
votes, err := db.GetAllVoteChoices(id)
if err != nil {
auditLog(s, fmt.Sprintf("Error while calculating vote result for ID %d: %s", id, err.Error()))
auditError(s, "", err)
return
}
var currentScore, totalTrust float64
@ -54,7 +55,7 @@ func checkForVoteResult(s *discordgo.Session, id int) {
}
trust, err := backend.GetTrust(s, vote.UserID)
if err != nil {
auditLog(s, fmt.Sprintf("Error while getting vote trust for user ID %d: %s", vote.UserID, err.Error()))
auditError(s, "", err)
return
}
currentScore += float64(vote.Value) * trust
@ -63,7 +64,7 @@ func checkForVoteResult(s *discordgo.Session, id int) {
totalGlobalTrust, err := backend.GetTotalTrust(s)
if err != nil {
auditLog(s, fmt.Sprintf("Error while getting total vote trust: %s", err.Error()))
auditError(s, "", err)
return
}
remainingTrust := totalGlobalTrust - totalTrust
@ -80,7 +81,7 @@ func checkForVoteResult(s *discordgo.Session, id int) {
return
}
}
auditLog(s, fmt.Sprintf("Rejection of vote ID %d has been confirmed.", id))
auditInfo(s, fmt.Sprintf("Rejection of vote ID %d has been confirmed.", id))
toAnnounceResultList = append(toAnnounceResultList, confirmedResult{
VoteID: id,
IsPositive: false,
@ -97,7 +98,7 @@ func checkForVoteResult(s *discordgo.Session, id int) {
return
}
}
auditLog(s, fmt.Sprintf("Acceptance of vote ID %d has been confirmed.", id))
auditInfo(s, fmt.Sprintf("Acceptance of vote ID %d has been confirmed.", id))
toAnnounceResultList = append(toAnnounceResultList, confirmedResult{
VoteID: id,
IsPositive: true,