summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/characters/titles_controller.rb26
-rw-r--r--app/models/character.rb3
-rw-r--r--app/models/chat_room.rb2
-rw-r--r--app/models/title.rb3
-rw-r--r--app/models/title_award.rb6
-rw-r--r--app/views/application/components/text/_title.html.erb8
-rw-r--r--app/views/characters/show.html.erb4
-rw-r--r--app/views/characters/titles/index.html.erb32
-rw-r--r--app/views/chat_messages/_message.html.erb4
9 files changed, 85 insertions, 3 deletions
diff --git a/app/controllers/characters/titles_controller.rb b/app/controllers/characters/titles_controller.rb
new file mode 100644
index 0000000..b321af9
--- /dev/null
+++ b/app/controllers/characters/titles_controller.rb
@@ -0,0 +1,26 @@
+class Characters::TitlesController < ApplicationController
+ before_action :set_character
+
+ def index
+ @title_awards = @character.title_awards
+ end
+
+ def activate
+ @title = Title.find(params[:title_id])
+ if current_char.title_awards.exists?(title: @title)
+ current_char.update(active_title: @title)
+ else
+ flash[:alert] = "You haven't earned that title."
+ end
+ redirect_to character_titles_path(current_char)
+ end
+
+ private
+ def set_character
+ @character = Character.find(params[:character_id])
+ unless current_char == @character
+ flash[:alert] = "You can only look at your own titles."
+ redirect_to character_path(@character)
+ end
+ end
+end
diff --git a/app/models/character.rb b/app/models/character.rb
index 41dc951..73d2c4b 100644
--- a/app/models/character.rb
+++ b/app/models/character.rb
@@ -1,6 +1,9 @@
class Character < ApplicationRecord
belongs_to :user
belongs_to :activity, optional: true
+ has_many :title_awards
+ has_many :titles, through: :title_awards
+ belongs_to :active_title, class_name: "Title", optional: true
has_one :hearth
has_many :character_items
has_many :learned_activities
diff --git a/app/models/chat_room.rb b/app/models/chat_room.rb
index 17e3f19..f1e9a24 100644
--- a/app/models/chat_room.rb
+++ b/app/models/chat_room.rb
@@ -14,7 +14,7 @@ class ChatRoom < ApplicationRecord
}
def self.accessible_to(user)
- all.select { |x| x.accessible_to?(user) }
+ all.select { |x| x.accessible_to?(user) && x.gid != "achievement" }
end
def accessible_to?(user)
diff --git a/app/models/title.rb b/app/models/title.rb
new file mode 100644
index 0000000..c80a1d1
--- /dev/null
+++ b/app/models/title.rb
@@ -0,0 +1,3 @@
+class Title < ApplicationRecord
+ validates :gid, :name, presence: true
+end
diff --git a/app/models/title_award.rb b/app/models/title_award.rb
new file mode 100644
index 0000000..ef74958
--- /dev/null
+++ b/app/models/title_award.rb
@@ -0,0 +1,6 @@
+class TitleAward < ApplicationRecord
+ belongs_to :title
+ belongs_to :character
+
+ validates :character_id, uniqueness: { scope: :title_id }
+end
diff --git a/app/views/application/components/text/_title.html.erb b/app/views/application/components/text/_title.html.erb
new file mode 100644
index 0000000..7d87180
--- /dev/null
+++ b/app/views/application/components/text/_title.html.erb
@@ -0,0 +1,8 @@
+<% if title %>
+ <% case title.gid %>
+ <% when "steward" %>
+ <span class="text-red-500 text-glow">Steward</span>
+ <% else %>
+ <%= title.name %>
+ <% end %>
+<% end %>
diff --git a/app/views/characters/show.html.erb b/app/views/characters/show.html.erb
index 4f2ae2e..819881b 100644
--- a/app/views/characters/show.html.erb
+++ b/app/views/characters/show.html.erb
@@ -2,6 +2,10 @@
<%= @character.name %>
</h1>
+<div class="text-lg mb-4">
+ <%= link_to "Titles", character_titles_path(@character) %>
+</div>
+
<p class="mb-4">First entered the planes
<%= pluralize((Date.current - @character.created_at.to_date).to_i, "day") %> ago.</p>
diff --git a/app/views/characters/titles/index.html.erb b/app/views/characters/titles/index.html.erb
new file mode 100644
index 0000000..3fb2781
--- /dev/null
+++ b/app/views/characters/titles/index.html.erb
@@ -0,0 +1,32 @@
+<h1 class="text-3xl mb-4">Titles</h1>
+
+<p class="mb-4">Here are the titles you've earned. Though they are forever yours until the end of these realms,
+ you may only display one at a time. How do you wish to be known?</p>
+
+<table class="table-auto">
+ <thead>
+ <tr>
+ <th class="table-header-padded">Displayed?</th>
+ <th class="table-header-padded">Title</th>
+ <th class="table-header-padded"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <% @title_awards.each do |title_award| %>
+ <tr>
+ <td><%= title_award.title == @character.active_title ? "Yes️" : "" %></td>
+ <td class="table-cell-padded">
+ <%= render "application/components/text/title", title: title_award.title %>
+ </td>
+ <td class="table-cell-padded">
+ <%= button_to "Display", character_title_activate_path(title_id: title_award.title.id) %>
+ </td>
+ </tr>
+ <% end %>
+ </tbody>
+</table>
+
+<% unless @title_awards.any? %>
+ <p>You haven't earned any titles, but fret not. The time has come for champions of all kinds.
+ Your hour is not far off.</p>
+<% end %>
diff --git a/app/views/chat_messages/_message.html.erb b/app/views/chat_messages/_message.html.erb
index e9663ec..793ed7f 100644
--- a/app/views/chat_messages/_message.html.erb
+++ b/app/views/chat_messages/_message.html.erb
@@ -28,14 +28,14 @@
<% elsif chat_message.chat_room.gid == "news" %>
<span class="<%= chat_room_text_class %>"><%= chat_message.body %></span>
<% elsif chat_message.chat_room.gid == "achievement" %>
- <%#= render "components/text/title", title: chat_message.target.current_title %>
+ <%= render "application/components/text/title", title: chat_message.target.active_title %>
<span class="<%= chat_room_text_class %>">
<%# TODO: Sort out this subject/target stuff that I just half-blindly ported over from old Esoterra. %>
<%= chat_message.target&.name %> <%= chat_message.body %>
</span>
<% else %>
<% if chat_message.sender %>
- <%#= render "components/text/title", title: chat_message.sender.current_title %>
+ <%= render "application/components/text/title", title: chat_message.sender.active_title %>
<% end %>
<span class="<%= chat_room_text_class %>">
<% if chat_message.sender %>