| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- require './app/commands/base_command.rb'
- class MemberCommand < BaseCommand
- def self.opts
- {
- # Nav consists of reaction sections and descriptions
- nav: {
- all: [ Emoji::EYES, "View all info about the character" ],
- image: [ Emoji::PICTURE, "Scroll though the character's images" ],
- bags: [ Emoji::BAGS, "View the character's inventory" ],
- family: [ Emoji::FAMILY, "View related characters" ],
- user: [ Emoji::BUST, "View the writer's other characters in a list" ]
- },
- # Usage has each option, in order with instructions, and a real example
- usage: {
- name:
- "Searches characters for the specified name, or discord user. " +
- "If no name is given, R0ry will show a list of all characters",
- section:
- "Skips to the specified section, some options include: bio, type, status, " +
- "rumors, image, bags. If no section is given, R0ry will default to history",
- keyword:
- "Displays a specific image, searched by its title, or keyword. " +
- "Can only be used if the section option is `image`",
- }
- }
- end
- def self.cmd
- desc = "Display info about the guild members"
- @cmd ||= Command.new(:member, desc, opts) do |event, name, section, keyword|
- # Determine display type: user, character, or list
- case name
- # Show user's character list
- when UID
- # Find User to display, and a list of their characters
- member = event.server.member(UID.match(name)[1])
- characters = Character.where(user_id: UID.match(name)[1])
- active_chars = characters.filter{ |c| c.active == 'Active' }
- # Generate embed and reply
- BotResponse.new(
- embed: user_char_embed(characters, member),
- carousel: active_chars.map(&:id),
- reactions: Emoji::NUMBERS.take(active_chars.count).push(Emoji::CROSS)
- )
- # Show Character List Embed
- when nil
- # Grab list of active characters, and types
- characters = Character.where(active: 'Active').order(:name)
- types = Type.all
- # Create reaction list
- reactions = Emoji::NUMBERS.take(4)
- # Generate embed, and reply
- BotResponse.new(
- embed: char_list_embed(characters, 'active', types),
- reactions: reactions.push(Emoji::CROSS)
- )
- # Show character embed
- when Integer
- # Find Character by ID and generate embed
- character = Character.find(name)
- char_reply(event, character, section, keyword)
- else
- # Find Character by name and generate embed
- character = Character.where('name ilike ?', name)
- raise 'Character not found!' if character.empty?
- char_reply(event, character, section, keyword)
- end
- rescue ActiveRecord::RecordNotFound => e
- error_embed("Record Not Found!", e.message)
- rescue StandardError => e
- error_embed(e.message)
- end
- end
- def self.char_reply(event, character, section, keyword)
- # Current channel restricted?
- sfw = !event.channel.nsfw?
- # Determine if duplicate characters, then filter NSFW if SFW channel
- if character.count > 1 && sfw
- chars = character.filter{ |c| c.rating == 'SFW' || c.rating == 'Hidden' } if sfw
- # If still more than 1 character, reply with duplicate embed
- if chars.length > 1
- embed = dup_char_embed(chars, chars.first.name)
- return BotResponse.new(
- embed: embed,
- reactions: Emoji::NUMBERS.take(chars.count)
- )
- end
- end
- character = character.first
- # Find image if specified
- image = CharImage.where(char_id: character.id).
- find_by(keyword: keyword || 'Default')
- # Ensure the content is appropriate for the current channel
- if sfw && ( image&.category == 'NSFW' || character.rating == 'NSFW' )
- return nsfw_char_embed(character, event)
- end
- # Generate Character Embed
- embed = character_embed(
- character: character,
- event: event,
- section: section,
- image: image
- )
- # Determine Carousel Type and create reply
- if section&.match(/images?/i)
- BotResponse.new(
- embed: embed,
- carousel: image,
- reactions: ImageCarousel.sections.map{ |k,v| k }.push(Emoji::CROSS)
- )
- else
- BotResponse.new(
- embed: embed,
- carousel: character,
- reactions: CharacterCarousel.sections.map{ |k,v| k }.push(Emoji::CROSS)
- )
- end
- end
- def self.example_command(event=nil)
- sections = ['all', 'bio', 'type', 'status', 'rumors', 'image', 'bags']
- case ['', 'user', 'name', 'section', 'keyword'].sample
- when ''
- []
- when 'user'
- user = Character.where(active: 'Active').order('RANDOM()').first.user_id
- member = event&.server&.member(user)
- ["@#{member&.nickname || member&.name || 'user_name'}"]
- when 'name'
- [Character.where.not(active: 'Deleted').order('RANDOM()').first.name]
- when 'section'
- [Character.where.not(active: 'Deleted').order('RANDOM()').first.name,
- sections.sample]
- when 'keyword'
- i = CharImage.where.not(keyword: 'Default').order('RANDOM()').first
- [Character.find(i.char_id).name, 'image', i.keyword]
- end
- end
- end
|