fix: emoji shortcodes

This commit is contained in:
trisua 2025-05-05 23:44:10 -04:00
parent 570a290954
commit 24cf61c783
7 changed files with 39 additions and 17 deletions

1
Cargo.lock generated
View file

@ -3711,6 +3711,7 @@ dependencies = [
"axum-extra",
"cf-turnstile",
"contrasted",
"emojis",
"futures-util",
"image",
"mime_guess",

View file

@ -47,3 +47,4 @@ async-stripe = { version = "0.41.0", features = [
"billing",
"runtime-tokio-hyper",
] }
emojis = "0.6.4"

View file

@ -1146,28 +1146,25 @@ secondary=false) -%}
<script>
document
.querySelector("emoji-picker")
.addEventListener("emoji-click", (event) => {
function gemoji() {
const use_first_shortcode = [
"grinning squinting face",
"smiling_face_with_heart_eyes",
];
.addEventListener("emoji-click", async (event) => {
if (event.detail.skinTone > 0) {
document.getElementById(
window.EMOJI_PICKER_TEXT_ID,
).value += event.detail.unicode;
if (
use_first_shortcode.includes(
event.detail.emoji.annotation,
) ||
!event.detail.emoji.shortcodes[1]
) {
return event.detail.emoji.shortcodes[0];
}
return event.detail.emoji.shortcodes[1];
document.getElementById("emoji_dialog").close();
return;
}
document.getElementById(
window.EMOJI_PICKER_TEXT_ID,
).value += ` :${gemoji()}:`;
).value += ` :${await (
await fetch("/api/v1/lookup_emoji", {
method: "POST",
body: event.detail.unicode,
})
).text()}:`;
document.getElementById("emoji_dialog").close();
});
</script>

View file

@ -0,0 +1,12 @@
use axum::response::IntoResponse;
/// Expand a unicode emoji into its Gemoji shortcode.
pub async fn get_emoji_shortcode(emoji: String) -> impl IntoResponse {
match emojis::get(&emoji) {
Some(e) => match e.shortcode() {
Some(s) => s.to_string(),
None => e.name().replace(" ", "-"),
},
None => String::new(),
}
}

View file

@ -1,4 +1,5 @@
pub mod communities;
pub mod emojis;
pub mod images;
pub mod posts;
pub mod questions;

View file

@ -311,6 +311,11 @@ pub fn routes() -> Router {
)
.route("/messages", post(channels::messages::create_request))
.route("/messages/{id}", delete(channels::messages::delete_request))
// emojis
.route(
"/lookup_emoji",
post(communities::emojis::get_emoji_shortcode),
)
}
#[derive(Deserialize)]

View file

@ -105,6 +105,11 @@ impl DataManager {
pub async fn create_emoji(&self, data: CustomEmoji) -> Result<()> {
let user = self.get_user_by_id(data.owner).await?;
// check if we can create animated emojis
if !user.permissions.check(FinePermission::SUPPORTER) && data.is_animated {
return Err(Error::RequiresSupporter);
}
// check user permission in community
if data.community != 0 {
let membership = self