From 87a75e570dcfee0b5088653657779efed072351b Mon Sep 17 00:00:00 2001 From: Chuck Date: Thu, 3 Aug 2023 23:51:18 -0700 Subject: [PATCH 1/5] Sneed Also adds the following: talking emotes: - Any emote can be talking now - If an emote is talking it can also be pettable - users can be talking and pettable - talking works both directions, large and small --- files/assets/css/main.css | 25 ++++++++++++-- files/assets/images/talking.webp | Bin 0 -> 1750 bytes files/assets/js/markdown.js | 56 ++++++++++++++++++++++++++----- files/classes/user.py | 2 +- files/helpers/sanitize.py | 33 ++++++++++++++---- 5 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 files/assets/images/talking.webp diff --git a/files/assets/css/main.css b/files/assets/css/main.css index f55407cdd..7883c46ba 100644 --- a/files/assets/css/main.css +++ b/files/assets/css/main.css @@ -5396,7 +5396,7 @@ textarea { } } .in-comment-image, .img, img[alt^="![]("], -.preview img:not(img[src^="/uid/"], img[src^="/pp/"], img[src$="/pic"], img[src$="/i/hand.webp"], img[src*="/e/"]) { +.preview img:not(img[src^="/uid/"], img[src^="/pp/"], img[src$="/pic"], img[src$="/i/hand.webp"], img[src$="/i/talking.webp"], img[src*="/e/"]) { max-height: 150px !important; max-width: 100% !important; border-radius: 0.2rem !important; @@ -5533,6 +5533,10 @@ img[src$="/i/hand.webp"] { margin-top: -10%; z-index: 1; } +img[src$="/i/talking.webp"] { + position: absolute; + width: 70%; +} img[src$="/i/hand.webp"]+img { animation: pat-pfp-anim 0.3s infinite; transform-origin: bottom center; @@ -5540,7 +5544,24 @@ img[src$="/i/hand.webp"]+img { text-align: center; object-fit: contain; } -img[src$="/i/hand.webp"]+img[src^="/pp/"], img[src$="/i/hand.webp"]+img[src$="/pic"] { +img[src$="/i/hand.webp"]+img[src$="/i/talking.webp"] { + padding-top: 20%; + padding-right: 5%; +} +img[src$="/i/hand.webp"]+img[src$="/i/talking.webp"]+img { + animation: pat-pfp-anim 0.3s infinite; + transform-origin: bottom center; + margin-top: 20%; + text-align: center; + object-fit: contain; +} +img[src$="/i/talking.webp"]+img { + padding-top: 22%; +} +img[src$="/i/talking.webp"]+img[src$="/i/hand.webp"]+img { + padding-top: 20%; +} +img[src$="/i/hand.webp"]+img[src^="/pp/"], img[src$="/i/hand.webp"]+img[src$="/pic"], img[src$="/i/talking.webp"]+img[src$="/pic"] { border-radius: 50%; } @keyframes pat-pfp-anim { diff --git a/files/assets/images/talking.webp b/files/assets/images/talking.webp new file mode 100644 index 0000000000000000000000000000000000000000..c0b2fffc8304113364c24e133b61716b15ff2c15 GIT binary patch literal 1750 zcmV;{1}XVcNk&G_1^@t8MM6+kP&il$0000G0001y001fg06|PpNV5X~01cpIYunmJ z`o3Sk*bKpPqfEoPs8RAJn!kseT5$=jiD;FrHVgx(xVnO1i4zY6%FpU z0ytJ1LN;5e0|bArukMbNMo`RxZmt59%SeBAx}!9J{OR*uO9cQ*pI7J|jd|_m&mQ-6 z1pxqL_=wBsWT;@h6_Y3ZZjA6o;oY~>{Ag%kjZrb3@9QfDZx!x+bCv9!w|Q+<;dI{9 zG6wG`{71|a=IEY*wM5nGZ+C19gm;$F9OP3Rof`~mhlKwuWLz;2-jlNVLb0F4XZI|I z^+M5qk2R}fb9jF${q>TSu6lH*rC@E4tla0BUX?b3OO>hP7HYg=M@KDI4De~1{^P}C( z26P5jEQ{24z4g~mejc423=9=<`w&oB_{-VqVlaWWhHwpKm3vR)_Nn`;4TpP*Wir4m zLQutpn5-&ieAh`Wj&My$6w!K)J5JDcqvH|l_ZY*iK$N>tI$d-+VRzS;8iQ*st2A%| zdqI2QLw?lG55@?Z0swfEs^w%8tn_1JYV|23v-sxl|X$M_=4H2)E@N;lHZm105Mw66P z7N_Cb?3DkCaVuM7W~;vwt_lF<;G|9TJ`C~l(*NZkX9!!7q%4av+jyFh%&DtuG!IqV zvdos{|2?Y^0pCK#M<2EoysV;#V5<@dSyfe#uNl8iTm^J z#h9~8k^l0;e5<^XB$1@D%1Z`ikrckKj4UZCA&DdaB9_%4CvCiME0-Xmjf&gnjRXWl zL_!KF2$>X8((A7ko@2-?m*+=@@?KN39l+Kn00062g11v1E*6$e55;G<4F%tcp05Yi z_Pb<}Zx#XXME~0#?za?thm^|=t0@4PM@x^lrpw`-gEoKL#2s{?#$^#ZzFsfOv zZxC6LTXhCNW#lGB63h1JpaTpbbgUNE8vqrFxA7&%ytsGIV3kM+>R(oI;JPW(663?& znbxTq0032qw@7Rw&$DuHn>PZhRfeJOMrFo7GdI`>id^ALD3<%b*i%(#gjIzAkUKF1 zfsNM*09H^qAoKzN0I(7OodGJ604o4KJs62YA|as}n;fhl1H`m|3g8aR|Catq{@e8x z`q`6(@|nl~vHn$MqJ1O$uNWFp{qN_G)eHF#8h=H50)Hz0$G#DYrl5;%D3iee=1K5Rg_QXUg^pQ9uAS%$2ud zPAtEO!cOcq8o`7PdOlzP{_LIJ5H0^0zsf?Nxc_*(a#}a#SEndjv;%4j-pvU)mbMiM zVlliYh@e&!pLU1Jb8~&PK8q=o1tR0|tJ&}O;@o^e@_~PWPp5l-j@LBJ2hf%g=)a+|f9KMG_pr;fg$(#gB z4caGz!aTA#bn}@V`Hw}qVoe}EVyB<+8>q}ZwKjvb+JGnam*->$!cfVvYTU)ACmawO^y)4xy`IU>4l{90spr+&)9U?%~)+5BXcc zfLZtpx-7{VYpfxK!yam2^cVd)y7Ra_3?AG1PtC5Hs_K<2&o(}KKe`Fc?*4zE&fL=~ z%-H907ZyHJ?d_P_8OPyQ{4-JUKkj|icQ(=xcXDsxrfP*=Mx&ZfPHt>hIYJTWN5CHU zumu+f{gD_l)QHKk>QY{wDs0m$*uQeNCzU`ajg)Y!uxH=EEN_Y$kCFtP=}l=a`Gg?q z0|s49b3k?W!%kDp`?m`_A$#h&xsEr898$MU_meUk_PyR_?{Be@4k<;X2u#N;8`oua`#m sDY%L90tHMIr#^%nJu9Qs77Q9`gzj(M<8C_w35KEK>_teC3sEcp03<3)DF6Tf literal 0 HcmV?d00001 diff --git a/files/assets/js/markdown.js b/files/assets/js/markdown.js index c45850293..0e2627ca3 100644 --- a/files/assets/js/markdown.js +++ b/files/assets/js/markdown.js @@ -65,6 +65,14 @@ function replace_image(match, prefix, url) { return match } +const MODIFIERS = { + PAT: 1, + TALKING: 2, + LARGE: 3, + REVERSED: 4, + USER: 5 +}; + function markdown(t) { let input = t.value; @@ -95,14 +103,46 @@ function markdown(t) { if(emojis != null){ for(i = 0; i < emojis.length; i++){ const old = emojis[i][0]; - if (old.includes('marseyrandom')) continue - let emoji = old.replace(/[:!@#]/g,'').toLowerCase(); - const mirroredClass = old.indexOf('!') == -1 ? '' : 'mirrored'; - const emojiClass = old.indexOf('#') == -1 ? 'emoji' : 'emoji-lg'; - if (emoji.endsWith('pat') && emoji != 'marseyunpettablepat') { - emoji = emoji.substr(0, emoji.length - 3); - const url = old.indexOf('@') != -1 ? `/@${emoji}/pic` : `${SITE_FULL_IMAGES}/e/${emoji}.webp`; - input = input.replace(old, ``); + if (old.includes('marseyrandom')) continue; + if (old.includes('marseyrandom')) continue + let emoji = old.replace(/[:]/g,'').toLowerCase(); + + const modifiers = new Set(); + const isTalkingFirst = !emoji.endsWith('pat') && emoji.endsWith('talking', -3); + if(emoji.endsWith('talking') || (emoji.endsWith('pat') && emoji.slice(0, -3).endsWith('talking'))) { + modifiers.add(MODIFIERS.TALKING); + emoji = emoji.endsWith('pat') ? [emoji.slice(0, -10), emoji.slice(-3)].join('') : emoji.slice(0, -7); + } + if(emoji.endsWith('pat')) { + modifiers.add(MODIFIERS.PAT); + emoji = emoji.slice(0, -3); + } + let length = emoji.length + emoji = emoji.startsWith('@', '') ? emoji.slice(1): emoji; + if(length !== emoji.length) { + modifiers.add(MODIFIERS.USER); + length = emoji.length + } + emoji = emoji.replaceAll('!', ''); + if(length !== emoji.length) { + modifiers.add(MODIFIERS.REVERSED); + length = emoji.length; + } + emoji = emoji.replaceAll('#', ''); + if(length !== emoji.length) { + modifiers.add(MODIFIERS.LARGE); + } + + + const mirroredClass = modifiers.has(MODIFIERS.REVERSED) ? 'mirrored' : ''; + const emojiClass = modifiers.has(MODIFIERS.LARGE) ? 'emoji-lg' : 'emoji'; + + if (modifiers.has(MODIFIERS.PAT) || modifiers.has(MODIFIERS.TALKING)) { + const talkingHtml = modifiers.has(MODIFIERS.TALKING) ? `` : ''; + const patHtml = modifiers.has(MODIFIERS.PAT) ? `` : ''; + const url = modifiers.has(MODIFIERS.USER) ? `/@${emoji}/pic` : `${SITE_FULL_IMAGES}/e/${emoji}.webp`; + const modifierHtml = isTalkingFirst ? `${talkingHtml}${patHtml}` : `${patHtml}${talkingHtml}`; + input = input.replace(old, `${modifierHtml}`); } else { input = input.replace(old, ``); } diff --git a/files/classes/user.py b/files/classes/user.py index 563b24ad3..93f2eb61f 100644 --- a/files/classes/user.py +++ b/files/classes/user.py @@ -281,7 +281,7 @@ class User(Base): @lazy def hats_owned_proportion_display(self): total_num_of_hats = g.db.query(HatDef).filter(HatDef.submitter_id == None, HatDef.price > 0).count() - proportion = f'{float(self.num_of_owned_hats) / total_num_of_hats:.1%}' + proportion = f'{float(self.num_of_owned_hats) / total_num_of_hats:.1%}' if total_num_of_hats > 0 else 'N/A' return (proportion, total_num_of_hats) @property diff --git a/files/helpers/sanitize.py b/files/helpers/sanitize.py index eb41e2faf..37a54fc72 100644 --- a/files/helpers/sanitize.py +++ b/files/helpers/sanitize.py @@ -245,12 +245,33 @@ def render_emoji(html, regexp, golden, emojis_used, b=False, is_title=False): emoji_partial = ':{0}:' emoji_html = None - if emoji.endswith('pat') and emoji != 'marseyunpettablepat': - if path.isfile(f"files/assets/images/emojis/{emoji.replace('pat','')}.webp"): - emoji_html = f'{emoji_partial_pat.format(old, f"{SITE_FULL_IMAGES}/e/{emoji[:-3]}.webp", attrs)}' - elif emoji.startswith('@'): - if u := get_user(emoji[1:-3], graceful=True): - emoji_html = f'{emoji_partial_pat.format(old, f"/pp/{u.id}", attrs)}' + is_talking = emoji.endswith('talking') or (emoji[:-3].endswith('talking') and emoji.endswith('pat')) + is_talking_first = emoji.endswith('talking') + emoji = emoji.replace('talking', '') if is_talking else emoji + is_patted = emoji.endswith('pat') + emoji = emoji.replace('pat', '') + is_user = emoji.startswith('@') + + end_modifier_length = 3 if is_patted else 0 + end_modifier_length = end_modifier_length + 7 if is_talking else end_modifier_length + + hand_html = f'' if is_patted and emoji != 'marseyunpettablepat' else '' + talking_html = f'' if is_talking else '' + + modifier_html = None + if (is_talking and is_patted): + modifier_html = f'{talking_html}{hand_html}' if is_talking_first else f'{hand_html}{talking_html}' + elif (is_patted): + modifier_html = hand_html + elif (is_talking): + modifier_html = talking_html + + if (is_patted and emoji != 'marseyunpettablepat') or is_talking: + if path.isfile(f"files/assets/images/emojis/{emoji}.webp"): + emoji_html = f'{modifier_html}{emoji_partial_pat.format(old, f"{SITE_FULL_IMAGES}/e/{emoji}.webp", attrs)}' + elif is_user: + if u := get_user(emoji[1:], graceful=True): + emoji_html = f'{modifier_html}{emoji_partial_pat.format(old, f"/pp/{u.id}", attrs)}' elif path.isfile(f'files/assets/images/emojis/{emoji}.webp'): emoji_html = emoji_partial.format(old, f'{SITE_FULL_IMAGES}/e/{emoji}.webp', attrs) -- 2.34.1 From bed31b236b6af778742ba4ce25fde34947b47280 Mon Sep 17 00:00:00 2001 From: Chuck Date: Thu, 3 Aug 2023 23:57:23 -0700 Subject: [PATCH 2/5] Restore marseyunpettable --- files/assets/js/markdown.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/files/assets/js/markdown.js b/files/assets/js/markdown.js index 0e2627ca3..5c633a6bc 100644 --- a/files/assets/js/markdown.js +++ b/files/assets/js/markdown.js @@ -108,7 +108,7 @@ function markdown(t) { let emoji = old.replace(/[:]/g,'').toLowerCase(); const modifiers = new Set(); - const isTalkingFirst = !emoji.endsWith('pat') && emoji.endsWith('talking', -3); + const isTalkingFirst = !(emoji.endsWith('pat') && emoji.slice(0, -3).endsWith('talking')); if(emoji.endsWith('talking') || (emoji.endsWith('pat') && emoji.slice(0, -3).endsWith('talking'))) { modifiers.add(MODIFIERS.TALKING); emoji = emoji.endsWith('pat') ? [emoji.slice(0, -10), emoji.slice(-3)].join('') : emoji.slice(0, -7); @@ -133,6 +133,12 @@ function markdown(t) { modifiers.add(MODIFIERS.LARGE); } + if(emoji === 'marseyunpettable') { + modifiers.delete(MODIFIERS.PAT); + if(!isTalkingFirst) { + modifiers.delete(MODIFIERS.TALKING); + } + } const mirroredClass = modifiers.has(MODIFIERS.REVERSED) ? 'mirrored' : ''; const emojiClass = modifiers.has(MODIFIERS.LARGE) ? 'emoji-lg' : 'emoji'; -- 2.34.1 From 86b4573c0c22a7938e721211e80375e55a70fbde Mon Sep 17 00:00:00 2001 From: Chuck Date: Fri, 4 Aug 2023 00:02:43 -0700 Subject: [PATCH 3/5] Add formatting for talking --- files/templates/formatting.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/files/templates/formatting.html b/files/templates/formatting.html index 2147b089b..ade969f63 100644 --- a/files/templates/formatting.html +++ b/files/templates/formatting.html @@ -102,11 +102,21 @@ Text 2 :marseylovepat: :marseylovepat: + + Talking Emojis + :marseylovetalking: + :marseylovetalking: + Pat User :@snappypat: :@snappypat: + + Talking User + :@snappytalking: + :@snappytalking: + {% if FEATURES['MARKUP_COMMANDS'] -%} Play slots using coins
-- 2.34.1 From 4c1a2f819c30febe14d8575419cdfbb017790be7 Mon Sep 17 00:00:00 2001 From: Chuck Date: Fri, 4 Aug 2023 00:08:33 -0700 Subject: [PATCH 4/5] Add a checkbox in the emoji picker --- files/templates/modals/emoji.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/files/templates/modals/emoji.html b/files/templates/modals/emoji.html index 832e5f42e..a1765a127 100644 --- a/files/templates/modals/emoji.html +++ b/files/templates/modals/emoji.html @@ -34,6 +34,10 @@ +
+ + +
-- 2.34.1 From e90781c4352138f29423a7988b43cbd413d3d11b Mon Sep 17 00:00:00 2001 From: Chuck Date: Fri, 4 Aug 2023 00:09:16 -0700 Subject: [PATCH 5/5] Missed changing the value in the previous commit --- files/templates/modals/emoji.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/templates/modals/emoji.html b/files/templates/modals/emoji.html index a1765a127..dd2fd3aeb 100644 --- a/files/templates/modals/emoji.html +++ b/files/templates/modals/emoji.html @@ -35,7 +35,7 @@
- +
-- 2.34.1