Skip to content

Commit 9cd6901

Browse files
committed
Get this running on modern ruby/rmagick/etc.
1 parent 071593f commit 9cd6901

File tree

12 files changed

+253
-138
lines changed

12 files changed

+253
-138
lines changed

.ruby-version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.5
1+
3.3.5

Gemfile

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
source "https://rubygems.org"
2-
ruby "2.1.5"
2+
ruby "3.3.5"
33

4-
gem 'rmagick'
5-
gem 'faraday'
6-
gem 'sinatra'
7-
gem "unicorn"
8-
gem 'instrumental_agent'
4+
gem "rmagick"
5+
gem "http"
6+
gem "sinatra"
7+
gem "puma"
98

109
gem "foreman", group: "development"

Gemfile.lock

Lines changed: 58 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,68 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
addressable (2.2.6)
5-
dotenv (1.0.2)
6-
faraday (0.7.5)
7-
addressable (~> 2.2.6)
8-
multipart-post (~> 1.1.3)
9-
rack (>= 1.1.0, < 2)
10-
foreman (0.76.0)
11-
dotenv (~> 1.0.2)
12-
thor (~> 0.19.1)
13-
instrumental_agent (0.8.2)
14-
kgio (2.9.2)
15-
multipart-post (1.1.4)
16-
rack (1.3.5)
17-
rack-protection (1.1.4)
18-
rack
19-
raindrops (0.13.0)
20-
rmagick (2.13.4)
21-
sinatra (1.3.1)
22-
rack (~> 1.3, >= 1.3.4)
23-
rack-protection (~> 1.1, >= 1.1.2)
24-
tilt (~> 1.3, >= 1.3.3)
25-
thor (0.19.1)
26-
tilt (1.3.3)
27-
unicorn (4.8.3)
28-
kgio (~> 2.6)
29-
rack
30-
raindrops (~> 0.7)
4+
addressable (2.8.7)
5+
public_suffix (>= 2.0.2, < 7.0)
6+
base64 (0.2.0)
7+
domain_name (0.6.20240107)
8+
ffi (1.17.0-arm64-darwin)
9+
ffi (1.17.0-x86_64-linux-gnu)
10+
ffi-compiler (1.3.2)
11+
ffi (>= 1.15.5)
12+
rake
13+
foreman (0.88.1)
14+
http (5.2.0)
15+
addressable (~> 2.8)
16+
base64 (~> 0.1)
17+
http-cookie (~> 1.0)
18+
http-form_data (~> 2.2)
19+
llhttp-ffi (~> 0.5.0)
20+
http-cookie (1.0.7)
21+
domain_name (~> 0.5)
22+
http-form_data (2.3.0)
23+
llhttp-ffi (0.5.0)
24+
ffi-compiler (~> 1.0)
25+
rake (~> 13.0)
26+
mustermann (3.0.3)
27+
ruby2_keywords (~> 0.0.1)
28+
nio4r (2.7.3)
29+
observer (0.1.2)
30+
pkg-config (1.5.6)
31+
public_suffix (6.0.1)
32+
puma (6.4.3)
33+
nio4r (~> 2.0)
34+
rack (3.1.7)
35+
rack-protection (4.0.0)
36+
base64 (>= 0.1.0)
37+
rack (>= 3.0.0, < 4)
38+
rack-session (2.0.0)
39+
rack (>= 3.0.0)
40+
rake (13.2.1)
41+
rmagick (6.0.1)
42+
observer (~> 0.1)
43+
pkg-config (~> 1.4)
44+
ruby2_keywords (0.0.5)
45+
sinatra (4.0.0)
46+
mustermann (~> 3.0)
47+
rack (>= 3.0.0, < 4)
48+
rack-protection (= 4.0.0)
49+
rack-session (>= 2.0.0, < 3)
50+
tilt (~> 2.0)
51+
tilt (2.4.0)
3152

3253
PLATFORMS
33-
ruby
54+
arm64-darwin-23
55+
x86_64-linux
3456

3557
DEPENDENCIES
36-
faraday
3758
foreman
38-
instrumental_agent
59+
http
60+
puma
3961
rmagick
4062
sinatra
41-
unicorn
63+
64+
RUBY VERSION
65+
ruby 3.3.5p100
66+
67+
BUNDLED WITH
68+
2.5.18

Procfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
web: bundle exec unicorn -p $PORT -E $RACK_ENV
2-
1+
web: bin/puma --config config/puma.rb

achievement.rb

Lines changed: 92 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,121 @@
1-
require 'digest/md5'
2-
require 'faraday'
3-
require 'RMagick'
4-
5-
def gravatar_image(email, dims = 46)
6-
client = Faraday::Connection.new(:url => "http://www.gravatar.com/")
7-
hash = Digest::MD5.hexdigest(email.downcase.strip)
8-
client.get("/avatar/#{hash}?s=#{dims}&d=mm").body
1+
require_relative "./gravatar"
2+
require "rmagick"
3+
4+
# TODO: better names
5+
BACKGROUND = "#3B3F40"
6+
CIRCLE = "#1B1D1A"
7+
CIRLCE_OFF = "#5D5F5E"
8+
CIRCLE_CENTER = "#1B1D1A"
9+
GREEN = "#6BBC6F"
10+
11+
TRANSPARENT = "rgba(0,0,0,255)"
12+
FULL_OPACITY = "rgba(255,255,255,255)"
13+
14+
def draw_circle(draw, x, y, radius)
15+
draw.circle(x, y, x, y + radius)
16+
end
17+
18+
def draw_rounded_area(draw, width, height)
19+
radius = height / 2
20+
draw_circle(draw, radius, radius, radius)
21+
draw_circle(draw, width - radius - 1, radius, radius)
22+
draw.rectangle(radius, 0, width - radius - 1, height)
923
end
1024

11-
def achievement(first_line, second_line, gravatar = nil)
12-
canvas = Magick::Image.new(423, 67) { |c| c.background_color = "none"; c.format = "png" }
25+
def achievement(first_line, second_line, email: nil)
26+
width = 423
27+
height = 67
28+
1329
draw = Magick::Draw.new
1430

15-
draw.fill("#3B3F40")
16-
draw.circle(33,33, 33,66)
17-
draw.circle(423 - 34,33, 423 - 34,66)
18-
draw.rectangle(33, 0, 423 - 34,67)
19-
20-
draw.fill("#1B1D1A")
21-
draw.circle(33,33, 33,62)
31+
draw.fill(BACKGROUND)
32+
draw_rounded_area(draw, width, height)
33+
34+
radius = height / 2
35+
dark_circle_radius = radius - 4
36+
37+
draw.fill(CIRCLE)
38+
draw_circle(draw, radius, radius, dark_circle_radius)
2239

23-
draw.fill("#5D5F5E")
24-
draw.circle(33,33, 33,60)
40+
player_circle_outer_radius = dark_circle_radius - 2
41+
draw.fill(CIRLCE_OFF)
42+
draw_circle(draw, radius, radius, player_circle_outer_radius)
43+
44+
#
2545

2646
odraw = Magick::Draw.new
2747
mdraw = Magick::Draw.new
28-
overlay = Magick::Image.new(423, 67)
29-
mask = Magick::Image.new(423, 67)
48+
overlay = Magick::Image.new(width, height)
49+
mask = Magick::Image.new(width, height)
3050

31-
odraw.fill("#6BBC6F")
32-
odraw.rectangle(0,0,423,67)
51+
odraw.fill(GREEN)
52+
odraw.rectangle(0, 0, width, height)
3353
odraw.draw(overlay)
34-
35-
mdraw.fill("rgba(0,0,0,255)")
36-
mdraw.rectangle(0, 0, 423,67)
37-
mdraw.fill("rgba(255,255,255,255)")
38-
mdraw.circle(33,33, 33,60)
39-
mdraw.fill("rgba(0,0,0,255)")
40-
mdraw.rectangle(33, 0, 423,67)
41-
mdraw.rectangle(0, 33, 423,67)
42-
54+
55+
# mdraw.fill(TRANSPARENT)
56+
mdraw.rectangle(0, 0, width, height)
57+
mdraw.fill(FULL_OPACITY)
58+
59+
player_circle_highlight_outer_radius = player_circle_outer_radius - 1
60+
draw_circle(mdraw, radius, radius, player_circle_highlight_outer_radius)
61+
62+
mdraw.fill(TRANSPARENT)
63+
mdraw.rectangle(radius, 0, width, height)
64+
mdraw.rectangle(0, radius, radius, height)
65+
4366
mdraw.draw(mask)
44-
45-
mask.matte = false
46-
overlay.matte = true
47-
overlay.composite!(mask, 0, 0, Magick::CopyOpacityCompositeOp)
48-
draw.composite(0, 0, 423, 67, overlay)
4967

68+
mask.alpha(Magick::OffAlphaChannel)
69+
# mask.matte = false
70+
# overlay.matte = true
71+
overlay.alpha(Magick::OnAlphaChannel)
72+
73+
overlay.composite!(mask, 0, 0, Magick::CopyAlphaCompositeOp)
74+
draw.composite(0, 0, width, height, overlay)
5075

51-
draw.fill("#1B1D1A")
52-
draw.rectangle(30, 6, 36,60)
53-
draw.rectangle(6, 30, 60,36)
54-
draw.circle(33,33, 33,54)
76+
# Crosshair
77+
draw.fill(CIRCLE_CENTER)
78+
crosshair_width = 6
79+
draw.rectangle(radius - crosshair_width / 2, radius - player_circle_highlight_outer_radius - 1, radius + crosshair_width / 2, radius * 2 - crosshair_width)
80+
draw.rectangle(radius - player_circle_highlight_outer_radius - 1, radius - crosshair_width / 2, radius * 2 - crosshair_width, radius + crosshair_width / 2)
81+
player_circle_highlight_inner_radius = player_circle_outer_radius - 7
82+
draw_circle(draw, radius, radius, player_circle_highlight_inner_radius)
5583

56-
if gravatar && (avatar = gravatar_image(gravatar))
84+
if email && (avatar = Gravatar.new(email).image_data)
5785
odraw = Magick::Draw.new
5886
mdraw = Magick::Draw.new
5987
aimg = Magick::Image.from_blob(avatar).first
60-
overlay = Magick::Image.new(423, 67)
61-
mask = Magick::Image.new(423, 67)
88+
overlay = Magick::Image.new(width, height)
89+
mask = Magick::Image.new(width, height)
6290

63-
odraw.composite(6, 8, 54, 54, aimg)
91+
odraw.composite(radius - player_circle_highlight_outer_radius - 1, radius - player_circle_highlight_outer_radius - 1, 54, 54, aimg)
6492
odraw.draw(overlay)
65-
mdraw.fill("rgba(0,0,0,255)")
66-
mdraw.rectangle(0, 0, 423,67)
67-
mdraw.fill("rgba(255,255,255,255)")
68-
mdraw.circle(33, 33, 33, 52)
93+
mdraw.fill(TRANSPARENT)
94+
mdraw.rectangle(0, 0, width, height)
95+
mdraw.fill(FULL_OPACITY)
96+
draw_circle(mdraw, radius, radius, 16)
6997
mdraw.draw(mask)
70-
mask.matte = false
71-
overlay.matte = true
72-
overlay.composite!(mask, 0, 0, Magick::CopyOpacityCompositeOp)
73-
draw.composite(0, 0, 423, 67, overlay)
98+
mask.alpha(Magick::OffAlphaChannel)
99+
# mask.matte = false
100+
# overlay.matte = true
101+
overlay.alpha(Magick::OnAlphaChannel)
102+
103+
overlay.composite!(mask, 0, 0, Magick::CopyAlphaCompositeOp)
104+
draw.composite(0, 0, width, height, overlay)
74105
end
75106

76107
draw.fill("#FFFFFF")
77108

78-
draw.font('fonts/LiberationSans-Regular.ttf')
79-
draw.font_size('15.5')
80-
draw.kerning('0.65')
81-
draw.text(75,29, first_line)
109+
draw.font("fonts/LiberationSans-Regular.ttf")
110+
draw.font_size("15.5")
111+
draw.kerning("0.65")
112+
draw.text(75, 29, first_line)
82113

83-
draw.font_size('15.5')
84-
draw.kerning('0.4')
85-
draw.text(75,50, second_line)
114+
draw.font_size("15.5")
115+
draw.kerning("0.4")
116+
draw.text(75, 50, second_line)
86117

118+
canvas = Magick::Image.new(width, height) { |c| c.background_color = "none"; c.format = "png" }
87119
draw.draw(canvas)
88120
canvas
89121
end

bin/puma

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env ruby
2+
# frozen_string_literal: true
3+
4+
#
5+
# This file was generated by Bundler.
6+
#
7+
# The application 'puma' is installed as part of a gem, and
8+
# this file is here to facilitate running it.
9+
#
10+
11+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12+
13+
bundle_binstub = File.expand_path("bundle", __dir__)
14+
15+
if File.file?(bundle_binstub)
16+
if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
17+
load(bundle_binstub)
18+
else
19+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21+
end
22+
end
23+
24+
require "rubygems"
25+
require "bundler/setup"
26+
27+
load Gem.bin_path("puma", "puma")

cli.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
require "bundler"
33
Bundler.setup(:default)
44

5-
require './achievement'
5+
require_relative "./achievement"
66

7-
first_line = 'ACHIEVEMENT UNLOCKED'
8-
second_line = 'you created an achievement generator'
9-
10-
achievement(first_line, second_line).write('image.png')
7+
first_line = "ACHIEVEMENT UNLOCKED"
8+
second_line = "you created an achievement generator"
119

10+
achievement(first_line, second_line, email: "elijah.miller@gmail.com").write("image.png")

config.ru

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
require './server'
2-
run Sinatra::Application
1+
require "./server"
2+
run Sinatra::Application

config/puma.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
workers Integer(ENV["WEB_CONCURRENCY"] || 2)
2+
threads_count = Integer(ENV["RAILS_MAX_THREADS"] || 5)
3+
threads threads_count, threads_count
4+
5+
preload_app!
6+
7+
rackup DefaultRackup if defined?(DefaultRackup)
8+
port ENV["PORT"] || 3000
9+
environment ENV["RACK_ENV"] || "development"
10+
11+
on_worker_boot do
12+
end

gravatar.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require "digest/md5"
2+
require "http"
3+
require "uri"
4+
5+
class Gravatar
6+
DEFAULT_DIMENSIONS = 46
7+
8+
attr_reader :email
9+
10+
def initialize(email)
11+
@email = email
12+
end
13+
14+
def image_data(dimensions: DEFAULT_DIMENSIONS)
15+
HTTP.get("https://www.gravatar.com/avatar/#{email_hash}", params: { s: dimensions, d: "mm" }).body
16+
end
17+
18+
def email_hash
19+
Digest::MD5.hexdigest(email.downcase.strip)
20+
end
21+
22+
def self.get(email, dimensions: 46)
23+
client = Faraday::Connection.new(:url => "https://www.gravatar.com/")
24+
hash = Digest::MD5.hexdigest(email.downcase.strip)
25+
client.get("/avatar/#{hash}?s=#{dims}&d=mm").body
26+
end
27+
end

0 commit comments

Comments
 (0)