Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attendance Command #142

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions commands/enabled.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ func populateSlashCommands(ctx ddtrace.SpanContext) {
SlashCommands["scoreboard"] = slash.Scoreboard
SlashCommands["birthday"] = slash.Birthday
SlashCommands["dquery"] = slash.DQuery
SlashCommands["attendance"] = slash.Attendance
}

// populateHandlers populates the Handlers map with all of the handlers
Expand Down
129 changes: 129 additions & 0 deletions commands/slash/attendance.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
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"
)

//Attendance slash command
func Attendance() (*discordgo.ApplicationCommand, func(s *discordgo.Session, i *discordgo.InteractionCreate)) {
return &discordgo.ApplicationCommand {
Name: "attendance",
Description: "Get signin history",
DefaultMemberPermissions: &permission.Member,
},
func(s *discordgo.Session, i *discordgo.InteractionCreate) {
span := tracer.StartSpan(
"commands.slash.attendance:Attendance",
tracer.ResourceName("/attendance"),
)
defer span.Finish()

logging.Debug(s, "Attendance command received", i.Member.User, span)

err := s.InteractionRespond(
i.Interaction,
&discordgo.InteractionResponse {
Type: discordgo.InteractionResponseChannelMessageWithSource,
Data: &discordgo.InteractionResponseData {
Content: attendanceMessage(i.Member.User.ID, span.Context()),
Flags: discordgo.MessageFlagsEphemeral,
},
},
)
if err != nil {
logging.Error(s, err.Error(), i.Member.User, span)
} else {
logging.Debug(s, "Signin History Given", i.Member.User, span)
}
}
}

//returns the message sent to the user by the Attendance command
func attendanceMessage(userID string, ctx ddtrace.SpanContext) (message string) {
span := tracer.StartSpan(
"commands.slash.attendance:attendanceMessage",
tracer.ResourceName("/attendance:attendanceMessage"),
tracer.ChildOf(ctx),
)
defer span.Finish()

message = "**Your Signins:**"
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(userID, 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 {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@c0untingNumbers I'll pass it for this PR but just as a heads up, I noticed in a few other places we're hard coding the signin types as a string and putting it through a giant switch statement. I'll make an issue about it but could you look into refactoring this?

Ideally, we'd declare both in one place with a simple helper function which can then be called everywhere else (or something along these lines). Thanks!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good idea. Will put that up for an issue.

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(userID, 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
}
Loading