From 19ccd05988441b23e01ab35d70e6b26dbae386b9 Mon Sep 17 00:00:00 2001 From: Owen Silsbee <68111875+oms125@users.noreply.github.com> Date: Sun, 20 Oct 2024 14:04:56 -0400 Subject: [PATCH] 134 adding the ability to query the amount of signins for a member (#146) Co-authored-by: c0unt <39505290+c0untingNumbers@users.noreply.github.com> --- commands/enabled.go | 1 + commands/slash/attendanceof.go | 139 +++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 commands/slash/attendanceof.go diff --git a/commands/enabled.go b/commands/enabled.go index af720fd..54bbeb0 100644 --- a/commands/enabled.go +++ b/commands/enabled.go @@ -34,6 +34,7 @@ func populateSlashCommands(ctx ddtrace.SpanContext) { SlashCommands["birthday"] = slash.Birthday SlashCommands["dquery"] = slash.DQuery SlashCommands["attendance"] = slash.Attendance + SlashCommands["attendanceof"] = slash.Attendanceof } // populateHandlers populates the Handlers map with all of the handlers diff --git a/commands/slash/attendanceof.go b/commands/slash/attendanceof.go new file mode 100644 index 0000000..198f7f7 --- /dev/null +++ b/commands/slash/attendanceof.go @@ -0,0 +1,139 @@ +package slash + +import ( + "fmt" + + "github.com/bwmarrin/discordgo" + "github.com/ritsec/ops-bot-iii/commands/slash/permission" + "github.com/ritsec/ops-bot-iii/data" + "github.com/ritsec/ops-bot-iii/ent/signin" + "github.com/ritsec/ops-bot-iii/logging" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +//Attendanceof slash command +func Attendanceof() (*discordgo.ApplicationCommand, func(s *discordgo.Session, i *discordgo.InteractionCreate)) { + return &discordgo.ApplicationCommand { + Name: "attendanceof", + Description: "Get signin history of a user", + DefaultMemberPermissions: &permission.IGLead, + Options: []*discordgo.ApplicationCommandOption { + { + Type: discordgo.ApplicationCommandOptionUser, + Name: "user", + Description: "The user whose signin history you want to check", + Required: true, + }, + }, + }, + func(s *discordgo.Session, i *discordgo.InteractionCreate) { + span := tracer.StartSpan( + "commands.slash.attendanceof:Attendanceof", + tracer.ResourceName("/attendanceof"), + ) + defer span.Finish() + + u := i.ApplicationCommandData().Options[0].UserValue(s) + + logging.Debug(s, "Attendanceof command received for " + u.Username, i.Member.User, span) + + err := s.InteractionRespond( + i.Interaction, + &discordgo.InteractionResponse { + Type: discordgo.InteractionResponseChannelMessageWithSource, + Data: &discordgo.InteractionResponseData { + Content: attendanceofMessage(u, span.Context()), + Flags: discordgo.MessageFlagsEphemeral, + }, + }, + ) + if err != nil { + logging.Error(s, err.Error(), i.Member.User, span) + } else { + logging.Debug(s, "Signin History Given for " + u.Username, i.Member.User, span) + } + } +} + +//returns the message sent to the user by the Attendanceof command +func attendanceofMessage(u *discordgo.User, ctx ddtrace.SpanContext) (message string) { + span := tracer.StartSpan( + "commands.slash.attendanceof:attendanceofMessage", + tracer.ResourceName("/attendanceof:attendanceofMessage"), + tracer.ChildOf(ctx), + ) + defer span.Finish() + + message = ("**Signins for " + u.Username + "**") + signinTypes := [...]string{ + "General Meeting", + "Contagion", + "IR", + "Ops", + "Ops IG", + "Red Team", + "Red Team Recruiting", + "RVAPT", + "Reversing", + "Physical", + "Wireless", + "WiCyS", + "Vulnerability Research", + "Mentorship", + "Other", + } + + totalSignins, err := data.Signin.GetSignins(u.ID, span.Context()) + if err != nil { + logging.Error(nil, err.Error(), nil, span) + totalSignins = 0 + } + message += fmt.Sprintf("\n\tTotal Signins: `%d`", totalSignins) + + for _, signinType := range signinTypes { + var entSigninType signin.Type + switch signinType { + case "General Meeting": + entSigninType = signin.TypeGeneralMeeting + case "Contagion": + entSigninType = signin.TypeContagion + case "IR": + entSigninType = signin.TypeIR + case "Ops": + entSigninType = signin.TypeOps + case "Ops IG": + entSigninType = signin.TypeOpsIG + case "Red Team": + entSigninType = signin.TypeRedTeam + case "Red Team Recruiting": + entSigninType = signin.TypeRedTeamRecruiting + case "RVAPT": + entSigninType = signin.TypeRVAPT + case "Reversing": + entSigninType = signin.TypeReversing + case "Physical": + entSigninType = signin.TypePhysical + case "Wireless": + entSigninType = signin.TypeWireless + case "WiCyS": + entSigninType = signin.TypeWiCyS + case "Vulnerability Research": + entSigninType = signin.TypeVulnerabilityResearch + case "Mentorship": + entSigninType = signin.TypeMentorship + case "Other": + entSigninType = signin.TypeOther + } + signins, err := data.Signin.GetSigninsByType(u.ID, entSigninType, span.Context()) + if err != nil { + logging.Error(nil, err.Error(), nil, span) + signins = 0 + } + if signins != 0 { + message += fmt.Sprintf("\n\t%s: `%d`", signinType, signins) + } + } + + return message +}