mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FEATURE: custom emojis
This commit is contained in:
92
app/models/emoji.rb
Normal file
92
app/models/emoji.rb
Normal 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
|
||||
38
app/models/emoji_set_site_setting.rb
Normal file
38
app/models/emoji_set_site_setting.rb
Normal 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
|
||||
@@ -1,8 +0,0 @@
|
||||
class UserFieldSerializer < ApplicationSerializer
|
||||
attributes :id,
|
||||
:name,
|
||||
:description,
|
||||
:field_type,
|
||||
:editable,
|
||||
:required
|
||||
end
|
||||
Reference in New Issue
Block a user