FEATURE: custom emojis

This commit is contained in:
Régis Hanol
2014-12-23 01:12:26 +01:00
parent 6e1601c10d
commit 45dbdb6896
3536 changed files with 477 additions and 245 deletions

92
app/models/emoji.rb Normal file
View File

@@ -0,0 +1,92 @@
class Emoji
include ActiveModel::SerializerSupport
attr_reader :path
attr_accessor :name, :url
# whitelist emojis so that new user can post emojis
Post::white_listed_image_classes << "emoji"
def initialize(path = nil)
@path = path
end
def remove
return if path.blank?
if File.exists?(path)
File.delete(path) rescue nil
Emoji.clear_cache
end
end
def self.all
@all ||= standard | custom
end
def self.standard
@standard ||= load_standard
end
def self.custom
@custom ||= load_custom
end
def self.create_from_path(path)
extension = File.extname(path)
Emoji.new(path).tap do |e|
e.name = File.basename(path, ".*")
e.url = "/#{base_url}/#{e.name}#{extension}"
end
end
def self.create_from_db_item(emoji)
name = emoji["aliases"].first
filename = "#{name}.png"
Emoji.new.tap do |e|
e.name = name
e.url = "/images/emoji/#{SiteSetting.emoji_set}/#{filename}"
end
end
def self.create_for(file, name)
extension = File.extname(file.original_filename)
path = "#{Emoji.base_directory}/#{name}#{extension}"
# store the emoji
FileUtils.mkdir_p(Pathname.new(path).dirname)
File.open(path, "wb") { |f| f << file.tempfile.read }
# clear the cache
Emoji.clear_cache
# return created emoji
Emoji.custom.detect { |e| e.name == name }
end
def self.clear_cache
@custom = nil
@all = nil
end
def self.db_file
"lib/emoji/db.json"
end
def self.load_standard
File.open(db_file, "r:UTF-8") { |f| JSON.parse(f.read) }
.map { |emoji| Emoji.create_from_db_item(emoji) }
end
def self.load_custom
Dir.glob(File.join(Emoji.base_directory, "*.{png,gif}"))
.sort
.map { |emoji| Emoji.create_from_path(emoji) }
end
def self.base_directory
"public/#{base_url}"
end
def self.base_url
db = RailsMultisite::ConnectionManagement.current_db
"uploads/#{db}/_emoji"
end
end

View File

@@ -0,0 +1,38 @@
require 'enum_site_setting'
class EmojiSetSiteSetting < EnumSiteSetting
# fix the URLs when changing the site setting
DiscourseEvent.on(:site_setting_saved) do |site_setting|
if site_setting.name.to_s == "emoji_set" && site_setting.value_changed?
before = "/images/emoji/#{site_setting.value_was}/"
after = "/images/emoji/#{site_setting.value}/"
Scheduler::Defer.later("Fix Emoji Links") do
Post.exec_sql("UPDATE posts SET cooked = REPLACE(cooked, :before, :after) WHERE cooked LIKE :like",
before: before,
after: after,
like: "%#{before}%"
)
end
end
end
def self.valid_value?(val)
values.any? { |v| v[:value] == val.to_s }
end
def self.values
@values ||= [
{ name: 'apple_international', value: 'apple' },
{ name: 'google', value: 'google' },
{ name: 'twitter', value: 'twitter' },
{ name: 'emoji_one', value: 'emoji_one' },
]
end
def self.translate_names?
true
end
end

View File

@@ -1,8 +0,0 @@
class UserFieldSerializer < ApplicationSerializer
attributes :id,
:name,
:description,
:field_type,
:editable,
:required
end