| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- require './app/commands/base_command.rb'
- class TeamCommand < BaseCommand
- def self.opts
- {
- usage: {
- team: "Searches for a team by it's name. If no team is specified, " +
- "R0ry will display a list of all teams.",
- action: "Accepts `create` to create a new team, " +
- "`update` inside a team's private channel to update team information, " +
- "`apply` to request for a character to join the team, and " +
- "`leave` to have a character leave the team",
- argument: "If creating or updating a team, this should be the description" +
- " for the team. If applying for or leaving a team, this should be your " +
- "character's name"
- }
- }
- end
- def self.cmd
- desc = "Rescue Teams: view, create, update, join or leave teams"
- @cmd ||= Command.new(:team, desc, opts) do |event, team_name, action, desc|
- # Save author
- author = event.author
- # --Execute--
- case action
- # New Team Request
- when /create/i
- raise 'Team Already Exists' if Team.find_by(name: team_name)
- reply = []
- # Request Team to Admin
- reply.push(BotResponse.new(
- destination: ENV['APP_CH'],
- embed: create_request(team_name, desc),
- reactions: Emoji::REQUEST
- ))
- # Sucess message to submitter
- reply.push(BotResponse.new(
- embed: success_embed("Your request for a new team has been submitted for approval!")
- ))
- # Existing Team Update
- when /update/i
- # Find appropriate team
- team = Team.find_by!(channel: event.channel.id)
- # Update team with new info
- team.update(name: team_name, description: desc)
- team.reload
- # Reply with new team info
- team_embed(team)
- # Team Join Request
- when /apply/i
- # Find appropriate team
- team = Team.find_by!('name ilike ?', team_name)
- # Find character, check if eligable
- char = Character.restricted_find(desc, author, ['Archived'])
- in_team = CharTeam.where(char_id: char.id).find_by(active: true)
- # Ensure if user is eligable
- if User.find(event.author.id).level < 5
- error_embed("You are not high enough level!")
- # Ensure team has open slots
- elsif CharTeam.where(team_id: team.id, active: true).count >= 6
- error_embed("#{team.name} is full!")
- # Ensure character is not in team or an admin
- elsif in_team && !Util::Roles.admin?(author)
- error_embed("#{char.name} is already in a team!")
- else
- # Character's creator [discord user]
- member = event.server.member(char.user_id.to_i)
- reply = []
- # Request message to team
- reply.push(BotResponse.new(
- destination: team.channel.to_i,
- embed: join_request(char, member),
- reactions: Emoji::REQUEST
- ))
- # Success message to sumbitter
- reply.push(BotResponse.new(
- embed: success_embed("Your request was sent to #{team.name}!")
- ))
- reply
- end
- # Member Leave Team
- when /leave/i
- # Find appropriate team
- team = Team.find_by!('name ilike ?', team_name)
- # Find character
- char = Character.restricted_find(desc, author, ['Archived'])
- # Remove character from team
- # Response indicates if user needs a role removed
- case team.leave(char)
- when Embed
- error_embed("Character not in Team!")
- when true
- user = event.server.member(char.user_id.to_i)
- user.remove_role(team.role.to_i)
- # Reply to alert team of member leave
- BotResponse.new(
- destination: team.channel.to_i,
- text: "#{char.name} has left the team"
- )
- when false
- # Reply to alert team of member leave
- BotResponse.new(
- destination: team.channel.to_i,
- text: "#{char.name} has left the team"
- )
- else
- error_embed("Something Went Wrong!")
- end
- # Disband Team
- when /archive/i, /disband/i
- # Find the team
- team = Team.find_by!(channel: event.channel.id)
- # Update team to inactive
- CharTeam.where(team_id: team.id).update(active: false)
- team.update(active: false)
- # Delete Role and archive channel
- event.server.role(team.role).delete('Archived Team')
- event.channel.category=(ENV['TEAM_ARCHIVES'])
- success_embed("Successfully Archived #{team.name}")
- # Display Team Info
- when nil
- team = Team.find_by!('name ilike ?', team_name) if team_name
- team_name ? team_embed(team) : teams_embed
- else
- command_error_embed("Could not process team request!", team)
- end
- rescue ActiveRecord::RecordNotFound => e
- error_embed("Record Not Found!", e.message)
- rescue StandardError => e
- error_embed(e.message)
- end
- end
- def self.example_command(event=nil)
- sample_team = [
- [ 'Hotel California', "You can checkout any time you like, but you can never leave~" ],
- [ 'The Jungle Team', "We've got fun and games. We've got everything you want!" ],
- [ 'Team Sudden Stop', "We are a great team full of many young adventures just looking for a g-" ],
- [ 'Little Nightmares', "Come play with us! *Forever, and ever and e v e r . . ." ],
- [ 'Puppo Pals', "Bork bork! Woof?" ]
- ].sample
- case ['', 'team', 'create', 'update', 'apply', 'leave'].sample
- when ''
- []
- when 'team'
- [Team.where(active: true).order('RANDOM()').first.name]
- when 'create'
- [sample_team[0], 'create', sample_team[1]]
- when 'update'
- [sample_team[0], 'update', sample_team[1]]
- when 'apply'
- [Team.where(active: true).order('RANDOM()').first.name,
- 'apply',
- Character.where(active: 'Active').order('RANDOM()').first.name]
- when 'leave'
- [Team.where(active: true).order('RANDOM()').first.name,
- 'leave',
- Character.where(active: 'Active').order('RANDOM()').first.name]
- end
- end
- def self.admin_opts
- {
- usage: {
- team: 'Team name, irrelevant, but must be done in team chat',
- action: 'Archive/Disband'
- }
- }
- end
- end
|