From 679394973af2cc9cee428302f79fc12e1ee2fb85 Mon Sep 17 00:00:00 2001 From: Kaplin86 <87865073+Kaplin86@users.noreply.github.com> Date: Wed, 22 Apr 2026 21:58:54 +0000 Subject: [PATCH 1/2] party sidequest --- app/assets/images/sidequests/party.png | Bin 0 -> 21918 bytes .../components/_sidequest_card.scss | 6 ++ app/models/achievement.rb | 13 ++++ app/models/sidequest/callbacks/party.rb | 32 +++++++++ .../party_approved.slack_message.slocks | 11 ++++ .../party_rejected.slack_message.slocks | 15 +++++ app/views/sidequests/_party.html.erb | 15 +++++ app/views/sidequests/show_party.html.erb | 61 ++++++++++++++++++ db/seeds.rb | 6 ++ 9 files changed, 159 insertions(+) create mode 100644 app/assets/images/sidequests/party.png create mode 100644 app/models/sidequest/callbacks/party.rb create mode 100644 app/views/notifications/sidequests/party_approved.slack_message.slocks create mode 100644 app/views/notifications/sidequests/party_rejected.slack_message.slocks create mode 100644 app/views/sidequests/_party.html.erb create mode 100644 app/views/sidequests/show_party.html.erb diff --git a/app/assets/images/sidequests/party.png b/app/assets/images/sidequests/party.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d403a1abc5699f5b7124c9a3fcb1bb2d1fb61a GIT binary patch literal 21918 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 { + SidequestEntry.approved + .joins(:sidequest, project: :memberships) + .where(sidequests: { slug: "party" }) + .where(project_memberships: { user_id: user.id, role: "owner" }) + .exists? + } + ), new( slug: :sidequest_converge, name: "Sidequest: Converge", diff --git a/app/models/sidequest/callbacks/party.rb b/app/models/sidequest/callbacks/party.rb new file mode 100644 index 000000000..c95328f05 --- /dev/null +++ b/app/models/sidequest/callbacks/party.rb @@ -0,0 +1,32 @@ + +module Sidequest::Callbacks + class Party + class << self + def on_approve(entry) + user = entry.project_owner + return unless user + + user.award_achievement!(:sidequest_party) + + SendSlackDmJob.perform_later( + user.id, + nil, + blocks_path: "notifications/sidequests/party_approved", + locals: { entry: entry, user: user } + ) + end + + def on_reject(entry) + user = entry.project_owner + return unless user + + SendSlackDmJob.perform_later( + user.id, + nil, + blocks_path: "notifications/sidequests/party_rejected", + locals: { entry: entry, user: user } + ) + end + end + end +end \ No newline at end of file diff --git a/app/views/notifications/sidequests/party_approved.slack_message.slocks b/app/views/notifications/sidequests/party_approved.slack_message.slocks new file mode 100644 index 000000000..a267e52a8 --- /dev/null +++ b/app/views/notifications/sidequests/party_approved.slack_message.slocks @@ -0,0 +1,11 @@ +header "🎉Party Sidequest Complete!" + +section "Your project *#{entry.project.title}* has been approved for the Party sidequest!", markdown: true + +section "You've unlocked the *Sidequest: Party* achievement!! You can also get some cool multiplayer goodies!", markdown: true + +divider + +content [ +mrkdwn_text("*Imagine theres a lot of confetti right here*" ) +] diff --git a/app/views/notifications/sidequests/party_rejected.slack_message.slocks b/app/views/notifications/sidequests/party_rejected.slack_message.slocks new file mode 100644 index 000000000..23ac96e4b --- /dev/null +++ b/app/views/notifications/sidequests/party_rejected.slack_message.slocks @@ -0,0 +1,15 @@ +header "❌ Party Sidequest Submission Not Approved" + +section "Your project *#{entry.project.title}* wasn't approved for the Party sidequest.", markdown: true + +if entry.rejection_message.present? + section "*Reason:* #{entry.rejection_message}", markdown: true +else + section "This could be because the project doesn't meet the requirements. Feel free to update your project and try again!", markdown: true +end + +divider + +context [ + mrkdwn_text("Questions? Reach out to Kaplin86 on Slack.") +] diff --git a/app/views/sidequests/_party.html.erb b/app/views/sidequests/_party.html.erb new file mode 100644 index 000000000..ed6ad5e78 --- /dev/null +++ b/app/views/sidequests/_party.html.erb @@ -0,0 +1,15 @@ +<%= link_to sidequest_path(sidequest), id: "party", class: "sidequest-card sidequest-card--party-purple sidequest-card--link" do %> +
+

Party

+
+ <%= image_tag "sidequests/party.png", + alt: "", + aria: {hidden: true}, + class: "sidequest-card__image" %> +
+

Build a multiplayer game. Submit to this sidequest to unlock a new shop item (and discounts on some other ones too)!

+ <% if sidequest.approved_count > 0 %> +

<%= pluralize(sidequest.approved_count, "submission") %>

+ <% end %> +
+<% end %> diff --git a/app/views/sidequests/show_party.html.erb b/app/views/sidequests/show_party.html.erb new file mode 100644 index 000000000..07798224f --- /dev/null +++ b/app/views/sidequests/show_party.html.erb @@ -0,0 +1,61 @@ +<% content_for :title, @sidequest.title %> +<% content_for :og_description, truncate(@sidequest.description.to_s, length: 200) %> +<% content_for :og_image, og_image_url('sidequests', format: :png) %> +<% content_for :twitter_card, "summary_large_image" %> + +<%= render HeadingComponent.new(title: @sidequest.title, tone: :blue, size: :full) %> + +
+
+ <% if @sidequest.description.present? %> +

<%= @sidequest.description %>

+ <% end %> + +
+ + <% if @approved_entries.any? %> + + <% else %> +
+

Be the first to submit

+
+ <% end %> + +
+ <%= render ButtonComponent.new( + text: "Back to Sidequests", + href: sidequests_path, + color: :brown, + variant: :borderless + ) %> +
+
+
\ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb index f01083224..5d528e680 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -83,6 +83,12 @@ sq.title = "Physics Lab" sq.description = "Build an interactive physics project and ship it on Flavortown to unlock physics prizes in the shop." end + +Sidequest.find_or_create_by!(slug: "party") do |sq| + sq.title = "Party" + sq.description = "Build a multiplayer game, then unlock prizes that help you play with friends." +end + Sidequest.find_or_create_by!(slug: "the_hackazine") do |sq| sq.title = "The Hackazine" sq.description = "This January: make a page for your project and get it in the Hack Club 2025 magazine! Join #magazine and submit before January 22nd. Projects selected for the magazine receive 50 cookies + stickers! Please note, magazine submissions have 0% AI tolerance." From 211b5a3a4c08806a38b75ad0952f850a4effd2b6 Mon Sep 17 00:00:00 2001 From: Anirudh Sahu Date: Thu, 23 Apr 2026 21:26:28 +0530 Subject: [PATCH 2/2] Update show_party.html.erb --- app/views/sidequests/show_party.html.erb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/app/views/sidequests/show_party.html.erb b/app/views/sidequests/show_party.html.erb index 07798224f..53bf60768 100644 --- a/app/views/sidequests/show_party.html.erb +++ b/app/views/sidequests/show_party.html.erb @@ -30,6 +30,25 @@ +<% if @prizes.present? && @prizes.any? %> +
+

Prizes

+
+ <% @prizes.each do |prize| %> + <%= link_to "/shop/order?shop_item_id=#{prize.id}", class: "sidequest-show__prize-row" do %> + <% if prize.image.attached? %> +
+ <%= image_tag prize.image.variant(:carousel_sm), alt: prize.name, loading: "lazy" %> +
+ <% end %> + <%= prize.name %> + <%= number_to_currency(prize.ticket_cost, precision: 0).gsub('$', '') %> + <% end %> + <% end %> +
+
+ <% end %> + <% if @approved_entries.any? %> - \ No newline at end of file +