Просмотр исходного кода

add basis for displaying landmarks

Kylie Jo Swistak 5 лет назад
Родитель
Сommit
41a2e9c360
7 измененных файлов с 293 добавлено и 16 удалено
  1. 4 0
      app/models/landmark_npcs.rb
  2. 5 0
      app/models/landmarks.rb
  3. 4 0
      app/models/regions.rb
  4. 9 0
      app/responses/carousel.rb
  5. 88 0
      app/responses/landmark.rb
  6. 180 16
      bot.rb
  7. 3 0
      lib/emoji.rb

+ 4 - 0
app/models/landmark_npcs.rb

@@ -0,0 +1,4 @@
+class LandmarkNpcs < ActiveRecord::Base
+  validates :character_id, presence: true
+  validates :landmark_id, presence: true
+end

+ 5 - 0
app/models/landmarks.rb

@@ -0,0 +1,5 @@
+class Landmark < ActiveRecord::Base
+  validates :name, presence: true
+  validates :description, presence: true
+  validates :category, presence: true
+end

+ 4 - 0
app/models/regions.rb

@@ -0,0 +1,4 @@
+class Region < ActiveRecord::Base
+  validates :name, presence: true
+  validates :description, presence: true
+end

+ 9 - 0
app/responses/carousel.rb

@@ -19,3 +19,12 @@ def option_react(message, opts)
   end
   message.react(Emoji::CROSS)
 end
+
+def landmark_react(message)
+  message.react(Emoji::BOOKS)
+  message.react(Emoji::SKULL)
+  message.react(Emoji::MAP)
+  message.react(Emoji::HOUSES)
+  message.react(Emoji::PEOPLE)
+  message.react(Emoji::CROSS)
+end

+ 88 - 0
app/responses/landmark.rb

@@ -0,0 +1,88 @@
+def landmark_embed(lm:, user: nil, section: nil, event: nil)
+  fields = []
+  icon = nil
+
+  user_name = case user
+              when /Server/i
+                icon = event.server.icon_url if event
+                'Server Owned'
+              when nil
+                icon = UNKNOWN_USER_IMG
+                'Unknown Creator'
+              else
+                icon = user.avatar_url
+                "#{user.name}##{user.tag}"
+              end
+
+  r = Region.find(lm.region)
+  npcs = []
+  npc_list = LandmarkNpcs.where(landmark_id: lm.id)
+  npc_list.each do |lmnpc|
+    npc = Character.find(lmnpc.character_id)
+    npcs.push "#{npc.name} - #{npc.species}"
+  end
+
+  inhabitants = npcs.empty? ? 'No known inhabitants' : npcs.join("\n")
+
+  embed = Embed.new(
+    footer: {
+      text: "#{user_name} | #{lm.category} | #{lm.rating}"
+    },
+    title: lm.name
+  )
+
+  case section
+  when :history, nil
+    embed.description = lm.description
+    embed.thumbnail = { url: lm.url } if lm.url
+
+    fields.push({name: 'Location', value: lm.location, inline: true}) if lm.location
+    fields.push({name: 'Region', value: r.name, inline: true}) if r
+    fields.push({name: 'History', value: lm.history}) if lm.history
+    fields.push({name: 'Folk Lore', value: lm.folk_lore}) if lm.folk_lore
+  when :warning
+    embed.description = lm.description
+    embed.thumbnail = { url: lm.w_url } if lm.w_url
+
+    fields.push({name: 'Kinks', value: lm.kink.join("\n")}) unless lm.kink.empty?
+    fields.push({name: 'Warning', value: lm.warning}) if lm.warning
+  when :map
+    if lm.map_url
+      embed.image = { url: lm.map_url }
+    else
+      embed.description = 'No Map Data'
+    end
+  when :layout
+    if lm.layout_url
+      embed.image = { url: lm.layout_url }
+    else
+      embed.description = 'No Layout Data'
+    end
+  when :npcs
+    embed.description = lm.description
+    embed.thumbnail = { url: lm.url } if lm.url
+
+    fields.push({name: 'NPC Residents', value: inhabitants})
+  end
+
+  embed.fields = fields
+  embed.footer.icon_url = icon
+
+  embed
+end
+
+def landmark_list
+  fields = []
+  rs = Region.all
+
+  rs.each do |r|
+    lms = Landmark.where(region: r.id)
+
+    fields.push({ name: r.name, value: lms.map(&:name).join("\n") }) unless lms.empty?
+  end
+
+  Embed.new(
+    title: 'Places of Interest',
+    fields: fields
+  )
+end

+ 180 - 16
bot.rb

@@ -882,6 +882,53 @@ roll = Command.new(:roll, desc, opts) do |event, die, array|
   end
 end
 
+opts = {
+  "" => "List all landmarks",
+  "name " => "Display the given landmark",
+}
+desc = "Display info about the guild members"
+landmark = Command.new(:landmark, desc, opts) do |event, name, section, keyword|
+  lm = Landmark.find_by!(name: name) if name
+
+  usr = case lm&.user_id
+        when /server/i
+          lm&.user_id
+        else
+          event.server.member(lm&.user_id)
+        end
+
+  if lm && !section && !keyword
+    embed = landmark_embed(lm: lm, user: usr, event: event)
+    msg = event.send_embed("", embed)
+    Carousel.create(message_id: msg.id, landmark_id: lm.id)
+
+    landmark_react(msg)
+  elsif lm && section && !keyword
+    case section
+    when /history/i
+      embed = landmark_embed(lm: lm, user: usr, section: :history, event: event)
+    when /warnings?/i
+      embed = landmark_embed(lm: lm, user: usr, section: :warning, event: event)
+    when /map/i
+      embed = landmark_embed(lm: lm, user: usr, section: :map, event: event)
+    when /layout/i
+      embed = landmark_embed(lm: lm, user: usr, section: :layout, event: event)
+    when /npcs?/i
+      embed = landmark_embed(lm: lm, user: usr, section: :npcs, event: event)
+    end
+
+    msg = event.send_embed("", embed)
+    Carousel.create(message_id: msg.id, landmark_id: lm.id)
+
+    landmark_react(msg)
+  elsif !name && !section && !keyword
+    landmark_list
+  end
+rescue ActiveRecord::RecordNotFound => e
+  error_embed("Record Not Found!", e.message)
+end
+
+
 # ---
 
 commands = [
@@ -899,7 +946,8 @@ commands = [
   cure,
   team,
   stats,
-  roll
+  roll,
+  landmark
 ]
 
 #locked_commands = [inv]
@@ -1002,8 +1050,10 @@ bot.reaction_add do |event|
     else
       if event.server == nil
         :new_app
-      elsif carousel
-        :carousel
+      elsif carousel&.char_id
+        :member
+      elsif carousel&.landmark_id
+        :landmark
       elsif team_chat
         :team_chat
       end
@@ -1029,6 +1079,11 @@ bot.reaction_add do |event|
     when reactions[Emoji::LEFT]&.count.to_i > 1 then :left
     when reactions[Emoji::RIGHT]&.count.to_i > 1 then :right
     when reactions[Emoji::UNDO]&.count.to_i > 1 then :back
+    when reactions[Emoji::BOOKS]&.count.to_i > 1 then :books
+    when reactions[Emoji::SKULL]&.count.to_i > 1 then :skull
+    when reactions[Emoji::MAP]&.count.to_i > 1 then :map
+    when reactions[Emoji::HOUSES]&.count.to_i > 1 then :houses
+    when reactions[Emoji::PEOPLE]&.count.to_i > 1 then :people
     when reactions[Emoji::PIN]&.count.to_i > 0 then :pin
     when reactions.any? { |k,v| Emoji::NUMBERS.include? k } then :number
     end
@@ -1193,7 +1248,7 @@ bot.reaction_add do |event|
   when [:item_rejection, :cross]
     event.message.delete
 
-  when [:carousel, :notebook]
+  when [:member, :notebook]
     emoji = Emoji::NOTEBOOK
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1220,7 +1275,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :question]
+  when [:member, :question]
     emoji = Emoji::QUESTION
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1247,7 +1302,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :pallet]
+  when [:member, :pallet]
     emoji = Emoji::PALLET
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1274,7 +1329,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :ear]
+  when [:member, :ear]
     emoji = Emoji::EAR
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1301,7 +1356,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :picture]
+  when [:member, :picture]
     event.message.delete_all_reactions
     char = Character.find(carousel.char_id)
     img = ImageController.img_scroll(
@@ -1330,7 +1385,7 @@ bot.reaction_add do |event|
     )
     event.message.edit("", embed)
     arrow_react(event.message)
-  when [:carousel, :bags]
+  when [:member, :bags]
     emoji = Emoji::BAGS
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1357,8 +1412,8 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :family]
-  when [:carousel, :eyes]
+  when [:member, :family]
+  when [:member, :eyes]
     emoji = Emoji::EYES
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1385,7 +1440,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :key]
+  when [:member, :key]
     emoji = Emoji::KEY
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1412,7 +1467,7 @@ bot.reaction_add do |event|
       event: event
     )
     event.message.edit("", embed)
-  when [:carousel, :back]
+  when [:member, :back]
     event.message.delete_all_reactions
     char = Character.find(carousel.char_id)
     user =
@@ -1435,7 +1490,7 @@ bot.reaction_add do |event|
     )
     event.message.edit("", embed)
     section_react(event.message)
-  when [:carousel, :left], [:carousel, :right]
+  when [:member, :left], [:member, :right]
     emoji = vote == :left ? Emoji::LEFT : Emoji::RIGHT
     users = event.message.reacted_with(emoji)
     users.each do |user|
@@ -1472,7 +1527,7 @@ bot.reaction_add do |event|
     )
     event.message.edit("", embed)
 
-  when [:carousel, :number]
+  when [:member, :number]
     char_index = nil
     Emoji::NUMBERS.each.with_index do |emoji, i|
       char_index = i if reactions[emoji]&.count.to_i > 1
@@ -1504,7 +1559,116 @@ bot.reaction_add do |event|
       event.message.edit("", embed)
       section_react(event.message)
     end
-  when [:carousel, :cross]
+  when [:member, :cross]
+    event.message.delete
+    carousel.delete
+
+  when [:landmark, :books]
+    emoji = Emoji::BOOKS
+    users = event.message.reacted_with(emoji)
+    users.each do |user|
+      event.message.delete_reaction(user.id, emoji) unless user.current_bot?
+    end
+
+    lm = Landmark.find(carousel.landmark_id)
+    user =
+      case
+      when lm.user_id.match(/server/i)
+        "Server Owned"
+      when member = event.server.member(lm.user_id)
+        member
+      else
+        nil
+      end
+
+    embed = landmark_embed(lm: lm, user: user, section: :history, event: event)
+    event.message.edit("", embed)
+
+  when [:landmark, :skull]
+    emoji = Emoji::SKULL
+    users = event.message.reacted_with(emoji)
+    users.each do |user|
+      event.message.delete_reaction(user.id, emoji) unless user.current_bot?
+    end
+
+    lm = Landmark.find(carousel.landmark_id)
+    user =
+      case
+      when lm.user_id.match(/server/i)
+        "Server Owned"
+      when member = event.server.member(lm.user_id)
+        member
+      else
+        nil
+      end
+
+    embed = landmark_embed(lm: lm, user: user, section: :warning, event: event)
+    event.message.edit("", embed)
+
+  when [:landmark, :map]
+    emoji = Emoji::MAP
+    users = event.message.reacted_with(emoji)
+    users.each do |user|
+      event.message.delete_reaction(user.id, emoji) unless user.current_bot?
+    end
+
+    lm = Landmark.find(carousel.landmark_id)
+    user =
+      case
+      when lm.user_id.match(/server/i)
+        "Server Owned"
+      when member = event.server.member(lm.user_id)
+        member
+      else
+        nil
+      end
+
+    embed = landmark_embed(lm: lm, user: user, section: :map, event: event)
+    event.message.edit("", embed)
+
+  when [:landmark, :houses]
+    emoji = Emoji::HOUSES
+    users = event.message.reacted_with(emoji)
+    users.each do |user|
+      event.message.delete_reaction(user.id, emoji) unless user.current_bot?
+    end
+
+    lm = Landmark.find(carousel.landmark_id)
+    user =
+      case
+      when lm.user_id.match(/server/i)
+        "Server Owned"
+      when member = event.server.member(lm.user_id)
+        member
+      else
+        nil
+      end
+
+    embed = landmark_embed(lm: lm, user: user, section: :layout, event: event)
+    event.message.edit("", embed)
+
+  when [:landmark, :people]
+    emoji = Emoji::PEOPLE
+    users = event.message.reacted_with(emoji)
+    users.each do |user|
+      event.message.delete_reaction(user.id, emoji) unless user.current_bot?
+    end
+
+    lm = Landmark.find(carousel.landmark_id)
+    user =
+      case
+      when lm.user_id.match(/server/i)
+        "Server Owned"
+      when member = event.server.member(lm.user_id)
+        member
+      else
+        nil
+      end
+
+    embed = landmark_embed(lm: lm, user: user, section: :npcs, event: event)
+    event.message.edit("", embed)
+
+  when [:landmark, :cross]
     event.message.delete
     carousel.delete
 

+ 3 - 0
lib/emoji.rb

@@ -72,6 +72,9 @@ module Emoji
   SMIRK = "😏"
   STAR = "⭐"
   PIN = "📌"
+  MAP = "🗺️"
+  HOUSES = "🏘️"
+  PEOPLE = "👥"
 
 
   LETTERS = [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]