Ver Fonte

revamp member list and pray it works

Kylie Jo Swistak há 5 anos atrás
pai
commit
b48b2e139a
3 ficheiros alterados com 131 adições e 47 exclusões
  1. 74 40
      app/responses/character.rb
  2. 2 3
      app/responses/landmark.rb
  3. 55 4
      bot.rb

+ 74 - 40
app/responses/character.rb

@@ -204,58 +204,92 @@ def char_sections(fields)
   fields
 end
 
-def char_list_embed(chars, user = nil)
+def char_list_embed(chars, group, sort = nil)
   fields = []
-  active = []
-  archived = []
-  owned_npcs = []
-  unowned_npcs = []
+  list = {}
+
+  case group
+  when /active/i
+    title = "Registered Guild Members -- [#{chars.count}]"
+    desc = "These are the pokemon registered to the guild, sorted by primary type"
+  when /archived/i
+    title = "Archived Guild Members -- [#{chars.count}]"
+    desc = "These are the pokemon in the guild archives, sorted by primary type"
+  when /npc/i
+    title = "Registered Guild NPCs -- [#{chars.length}]"
+    desc = "These are the NPCs from all around Zaplana, sorted by primary type"
+  when /special/i
+    title = "Specail Characters -- [#{chars.count}]"
+    desc = "These are the special pokemon around Zaplana, sorted by category"
+  end
 
-  list = {
-    "Active Guild Members" => active,
-    "Archived Guild Members" => archived,
-    "NPCs" => owned_npcs,
-    "Public NPCs" => unowned_npcs
-  }
+  case sort&.first
+  when Type
+    sort.each do |s|
+      list[s.name] = chars.map{ |c| c.name if c.types.split("/").first === s.name }.compact
+    end
 
-  chars.each do |char|
-    case char.active
-    when 'Active'
-      active.push char.name
-    when 'Archived'
-      archived.push char.name
-    when 'NPC'
-      owned_npcs.push char.name if char.user_id != 'Public'
-      unowned_npcs.push char.name if char.user_id == 'Public'
+    list = list.reject { |k,v| v == [] }
+    list.each do |k,v|
+      fields.push({ name: k, value: v.join(", ") })
     end
-  end
+  when Region
+    sort.each do |s|
+      list[s.name] = chars.map do |c|
+        next unless c.region == s.name
+        name = c.name
+        name += "*#{name}*" if c.user_id === /public/i
+        name += "~~#{name}~~" if c.rating === /NSFW/i
+        name
+      end.compact
+    end
+
+
+    list["Unknown"] = chars.map do |c|
+      next unless c.region.nil?
+      name = c.name
+      name += "*#{name}*" if c.user_id === /public/i
+      name += "~~#{name}~~" if c.rating === /NSFW/i
+      name
+    end.compact
 
-  list.each do |name, array|
-    unless array.empty?
-      array = array.sort
+    list = list.reject { |k,v| v == [] }
+    list.each do |k,v|
+      fields.push({ name: k, value: v.join(", ") })
+    end
+  when nil
+    list["guild"] = []
+    list["legend"] = []
+
+    chars.each do |c|
+      case c.special
+      when /legend/i
+        list["legend"].push("#{c.name}, #{c.species} -- last seen: #{c.location || "???"}")
+      when /guild/i
+        list["guild"].push("#{c.name}, #{c.species}")
+      end
+    end
 
-      array.each_slice(100).each_with_index do |a, i|
-        fields.push({
-          name: "#{name} [#{i > 0 ? 'cont' : array.count}]",
-          value: a.join(", ")
-        })
+    list = list.reject { |k,v| v == [] }
+    list.each do |k,v|
+      case k
+      when /legend/i
+        fields.push({ name: "Mythic/Legend Pokemon", value: v.join("\n") })
+      when /guild/i
+        fields.push({ name: "Guild Employees", value: v.join("\n") })
       end
     end
   end
 
-  embed = Embed.new(
-    title: "Registered Pokemon [#{chars.count}]",
-    fields: fields
-  )
-
-  if user
-    user_name = user.nickname || user.name
-
-    embed.color = user.color.combined
-    embed.title = "#{user_name}'s Characters"
+  if fields.empty?
+    fields.push({name: "No Resulst", value: "--"})
   end
 
-  embed
+  Embed.new(
+    title: title,
+    description: desc,
+    fields: fields
+  )
 end
 
 def user_char_embed(chars, user)

+ 2 - 3
app/responses/landmark.rb

@@ -19,9 +19,8 @@ def landmark_embed(lm:, user: nil, section: nil, event: nil)
   r = Region.find(lm.region)
   plm = Landmark.find(lm.location) if lm.location
   npcs = []
-  npc_list = LandmarkNpcs.where(landmark_id: lm.id)
-  npc_list.each do |lmnpc|
-    npc = Character.find(lmnpc.character_id)
+  npc_list = Character.where(location: lm.name)
+  npc_list.each do |npc|
     npcs.push "#{npc.name} - #{npc.species}"
   end
 

+ 55 - 4
bot.rb

@@ -539,8 +539,18 @@ member = Command.new(:member, desc, opts) do |event, name, section, keyword|
 
   case
   when !name
-    chars = Character.all
-    char_list_embed(chars)
+    chars = Character.where(active: 'Active')
+    types = Type.all
+
+    embed = char_list_embed(chars, 'active', types)
+    msg = event.send_embed("", embed)
+    Carousel.create(message_id: msg.id)
+
+    msg.react(Emoji::ONE)
+    msg.react(Emoji::TWO)
+    msg.react(Emoji::THREE)
+    msg.react(Emoji::FOUR)
+    msg.react(Emoji::CROSS)
   when name && user_id
     chars = Character.where(user_id: user_id[1])
     user = event.server.member(user_id[1])
@@ -1149,6 +1159,8 @@ bot.reaction_add do |event|
         :member
       elsif carousel&.landmark_id
         :landmark
+      elsif carousel&.message_id
+        :member
       elsif team_chat
         :team_chat
       end
@@ -1647,10 +1659,16 @@ bot.reaction_add do |event|
 
   when [:member, :number]
     char_index = nil
+    emote = nil
+
     Emoji::NUMBERS.each.with_index do |emoji, i|
-      char_index = i if reactions[emoji]&.count.to_i > 1
+      if reactions[emoji]&.count.to_i > 1
+        char_index = i
+        emote = emoji
+      end
     end
-    if char_index
+
+    if char_index && carousel&.options
       event.message.delete_all_reactions
 
       char = Character.find(carousel.options[char_index])
@@ -1681,6 +1699,39 @@ bot.reaction_add do |event|
 
       event.message.edit("", embed)
       section_react(event.message)
+    elsif char_index && carousel&.options.nil?
+      users = event.message.reacted_with(emote)
+      users.each do |user|
+        event.message.delete_reaction(user.id, emote) unless user.current_bot?
+      end
+
+      case char_index
+      when 0
+        chars = Character.where(active: 'Active')
+        types = Type.all
+
+        embed = char_list_embed(chars, 'active', types)
+      when 1
+        chars = Character.where(active: 'Archived')
+        types = Type.all
+
+        embed = char_list_embed(chars, 'archived', types)
+      when 2
+        chars = Character
+          .select('characters.*, COALESCE(r.name, r2.name) AS region')
+          .joins('LEFT OUTER JOIN landmarks l on l.name = characters.location')
+          .joins('LEFT OUTER JOIN regions r on r.id = l.region')
+          .joins('LEFT OUTER JOIN regions r2 on characters.location = r2.name')
+          .where(active: 'NPC')
+
+        regions = Region.all
+        embed = char_list_embed(chars, 'npc', regions)
+      when 3
+        chars = Character.where.not(special: nil)
+        embed = char_list_embed(chars, 'special')
+      end
+
+      event.message.edit("", embed)
     end
   when [:member, :cross]
     event.message.delete