forked from AkkomaGang/akkoma
Merge remote-tracking branch 'remotes/origin/develop' into auth-improvements
This commit is contained in:
commit
a010c5b16a
24 changed files with 5273 additions and 1086 deletions
|
@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Polls now always return a `voters_count`, even if they are single-choice.
|
- Polls now always return a `voters_count`, even if they are single-choice.
|
||||||
- Admin Emails: The ap id is used as the user link in emails now.
|
- Admin Emails: The ap id is used as the user link in emails now.
|
||||||
- Search: When using Postgres 11+, Pleroma will use the `websearch_to_tsvector` function to parse search queries.
|
- Search: When using Postgres 11+, Pleroma will use the `websearch_to_tsvector` function to parse search queries.
|
||||||
|
- Emoji: Support the full Unicode 13.1 set of Emoji for reactions, plus regional indicators.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
|
|
@ -579,14 +579,14 @@ Emoji reactions work a lot like favourites do. They make it possible to react to
|
||||||
### React to a post with a unicode emoji
|
### React to a post with a unicode emoji
|
||||||
* Method: `PUT`
|
* Method: `PUT`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
* Params: `emoji`: A single character unicode emoji
|
* Params: `emoji`: A unicode RGI emoji or a regional indicator
|
||||||
* Response: JSON, the status.
|
* Response: JSON, the status.
|
||||||
|
|
||||||
## `DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji`
|
## `DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji`
|
||||||
### Remove a reaction to a post with a unicode emoji
|
### Remove a reaction to a post with a unicode emoji
|
||||||
* Method: `DELETE`
|
* Method: `DELETE`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
* Params: `emoji`: A single character unicode emoji
|
* Params: `emoji`: A unicode RGI emoji or a regional indicator
|
||||||
* Response: JSON, the status.
|
* Response: JSON, the status.
|
||||||
|
|
||||||
## `GET /api/v1/pleroma/statuses/:id/reactions`
|
## `GET /api/v1/pleroma/statuses/:id/reactions`
|
||||||
|
|
|
@ -98,12 +98,6 @@ def shell_prompt(prompt, defval \\ nil, defname \\ nil) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def shell_yes?(message) do
|
|
||||||
if mix_shell?(),
|
|
||||||
do: Mix.shell().yes?("Continue?"),
|
|
||||||
else: shell_prompt(message, "Continue?") in ~w(Yn Y y)
|
|
||||||
end
|
|
||||||
|
|
||||||
def shell_info(message) do
|
def shell_info(message) do
|
||||||
if mix_shell?(),
|
if mix_shell?(),
|
||||||
do: Mix.shell().info(message),
|
do: Mix.shell().info(message),
|
||||||
|
|
|
@ -60,7 +60,7 @@ def run(["new", nickname, email | rest]) do
|
||||||
- admin: #{if(admin?, do: "true", else: "false")}
|
- admin: #{if(admin?, do: "true", else: "false")}
|
||||||
""")
|
""")
|
||||||
|
|
||||||
proceed? = assume_yes? or shell_yes?("Continue?")
|
proceed? = assume_yes? or shell_prompt("Continue?", "n") in ~w(Yn Y y)
|
||||||
|
|
||||||
if proceed? do
|
if proceed? do
|
||||||
start_pleroma()
|
start_pleroma()
|
||||||
|
|
|
@ -194,6 +194,19 @@ def get_by_id(id) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_by_id_with_user_actor(id) do
|
||||||
|
case FlakeId.flake_id?(id) do
|
||||||
|
true ->
|
||||||
|
Activity
|
||||||
|
|> where([a], a.id == ^id)
|
||||||
|
|> with_preloaded_user_actor()
|
||||||
|
|> Repo.one()
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def get_by_id_with_object(id) do
|
def get_by_id_with_object(id) do
|
||||||
Activity
|
Activity
|
||||||
|> where(id: ^id)
|
|> where(id: ^id)
|
||||||
|
|
|
@ -1,769 +0,0 @@
|
||||||
# emoji-data.txt
|
|
||||||
# Date: 2019-01-15, 12:10:05 GMT
|
|
||||||
# © 2019 Unicode®, Inc.
|
|
||||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
|
||||||
# For terms of use, see http://www.unicode.org/terms_of_use.html
|
|
||||||
#
|
|
||||||
# Emoji Data for UTS #51
|
|
||||||
# Version: 12.0
|
|
||||||
#
|
|
||||||
# For documentation and usage, see http://www.unicode.org/reports/tr51
|
|
||||||
#
|
|
||||||
# Format:
|
|
||||||
# <codepoint(s)> ; <property> # <comments>
|
|
||||||
# Note: there is no guarantee as to the structure of whitespace or comments
|
|
||||||
#
|
|
||||||
# Characters and sequences are listed in code point order. Users should be shown a more natural order.
|
|
||||||
# See the CLDR collation order for Emoji.
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Emoji=No
|
|
||||||
# @missing: 0000..10FFFF ; Emoji ; No
|
|
||||||
|
|
||||||
0023 ; Emoji # 1.1 [1] (#️) number sign
|
|
||||||
002A ; Emoji # 1.1 [1] (*️) asterisk
|
|
||||||
0030..0039 ; Emoji # 1.1 [10] (0️..9️) digit zero..digit nine
|
|
||||||
00A9 ; Emoji # 1.1 [1] (©️) copyright
|
|
||||||
00AE ; Emoji # 1.1 [1] (®️) registered
|
|
||||||
203C ; Emoji # 1.1 [1] (‼️) double exclamation mark
|
|
||||||
2049 ; Emoji # 3.0 [1] (⁉️) exclamation question mark
|
|
||||||
2122 ; Emoji # 1.1 [1] (™️) trade mark
|
|
||||||
2139 ; Emoji # 3.0 [1] (ℹ️) information
|
|
||||||
2194..2199 ; Emoji # 1.1 [6] (↔️..↙️) left-right arrow..down-left arrow
|
|
||||||
21A9..21AA ; Emoji # 1.1 [2] (↩️..↪️) right arrow curving left..left arrow curving right
|
|
||||||
231A..231B ; Emoji # 1.1 [2] (⌚..⌛) watch..hourglass done
|
|
||||||
2328 ; Emoji # 1.1 [1] (⌨️) keyboard
|
|
||||||
23CF ; Emoji # 4.0 [1] (⏏️) eject button
|
|
||||||
23E9..23F3 ; Emoji # 6.0 [11] (⏩..⏳) fast-forward button..hourglass not done
|
|
||||||
23F8..23FA ; Emoji # 7.0 [3] (⏸️..⏺️) pause button..record button
|
|
||||||
24C2 ; Emoji # 1.1 [1] (Ⓜ️) circled M
|
|
||||||
25AA..25AB ; Emoji # 1.1 [2] (▪️..▫️) black small square..white small square
|
|
||||||
25B6 ; Emoji # 1.1 [1] (▶️) play button
|
|
||||||
25C0 ; Emoji # 1.1 [1] (◀️) reverse button
|
|
||||||
25FB..25FE ; Emoji # 3.2 [4] (◻️..◾) white medium square..black medium-small square
|
|
||||||
2600..2604 ; Emoji # 1.1 [5] (☀️..☄️) sun..comet
|
|
||||||
260E ; Emoji # 1.1 [1] (☎️) telephone
|
|
||||||
2611 ; Emoji # 1.1 [1] (☑️) check box with check
|
|
||||||
2614..2615 ; Emoji # 4.0 [2] (☔..☕) umbrella with rain drops..hot beverage
|
|
||||||
2618 ; Emoji # 4.1 [1] (☘️) shamrock
|
|
||||||
261D ; Emoji # 1.1 [1] (☝️) index pointing up
|
|
||||||
2620 ; Emoji # 1.1 [1] (☠️) skull and crossbones
|
|
||||||
2622..2623 ; Emoji # 1.1 [2] (☢️..☣️) radioactive..biohazard
|
|
||||||
2626 ; Emoji # 1.1 [1] (☦️) orthodox cross
|
|
||||||
262A ; Emoji # 1.1 [1] (☪️) star and crescent
|
|
||||||
262E..262F ; Emoji # 1.1 [2] (☮️..☯️) peace symbol..yin yang
|
|
||||||
2638..263A ; Emoji # 1.1 [3] (☸️..☺️) wheel of dharma..smiling face
|
|
||||||
2640 ; Emoji # 1.1 [1] (♀️) female sign
|
|
||||||
2642 ; Emoji # 1.1 [1] (♂️) male sign
|
|
||||||
2648..2653 ; Emoji # 1.1 [12] (♈..♓) Aries..Pisces
|
|
||||||
265F..2660 ; Emoji # 1.1 [2] (♟️..♠️) chess pawn..spade suit
|
|
||||||
2663 ; Emoji # 1.1 [1] (♣️) club suit
|
|
||||||
2665..2666 ; Emoji # 1.1 [2] (♥️..♦️) heart suit..diamond suit
|
|
||||||
2668 ; Emoji # 1.1 [1] (♨️) hot springs
|
|
||||||
267B ; Emoji # 3.2 [1] (♻️) recycling symbol
|
|
||||||
267E..267F ; Emoji # 4.1 [2] (♾️..♿) infinity..wheelchair symbol
|
|
||||||
2692..2697 ; Emoji # 4.1 [6] (⚒️..⚗️) hammer and pick..alembic
|
|
||||||
2699 ; Emoji # 4.1 [1] (⚙️) gear
|
|
||||||
269B..269C ; Emoji # 4.1 [2] (⚛️..⚜️) atom symbol..fleur-de-lis
|
|
||||||
26A0..26A1 ; Emoji # 4.0 [2] (⚠️..⚡) warning..high voltage
|
|
||||||
26AA..26AB ; Emoji # 4.1 [2] (⚪..⚫) white circle..black circle
|
|
||||||
26B0..26B1 ; Emoji # 4.1 [2] (⚰️..⚱️) coffin..funeral urn
|
|
||||||
26BD..26BE ; Emoji # 5.2 [2] (⚽..⚾) soccer ball..baseball
|
|
||||||
26C4..26C5 ; Emoji # 5.2 [2] (⛄..⛅) snowman without snow..sun behind cloud
|
|
||||||
26C8 ; Emoji # 5.2 [1] (⛈️) cloud with lightning and rain
|
|
||||||
26CE ; Emoji # 6.0 [1] (⛎) Ophiuchus
|
|
||||||
26CF ; Emoji # 5.2 [1] (⛏️) pick
|
|
||||||
26D1 ; Emoji # 5.2 [1] (⛑️) rescue worker’s helmet
|
|
||||||
26D3..26D4 ; Emoji # 5.2 [2] (⛓️..⛔) chains..no entry
|
|
||||||
26E9..26EA ; Emoji # 5.2 [2] (⛩️..⛪) shinto shrine..church
|
|
||||||
26F0..26F5 ; Emoji # 5.2 [6] (⛰️..⛵) mountain..sailboat
|
|
||||||
26F7..26FA ; Emoji # 5.2 [4] (⛷️..⛺) skier..tent
|
|
||||||
26FD ; Emoji # 5.2 [1] (⛽) fuel pump
|
|
||||||
2702 ; Emoji # 1.1 [1] (✂️) scissors
|
|
||||||
2705 ; Emoji # 6.0 [1] (✅) check mark button
|
|
||||||
2708..2709 ; Emoji # 1.1 [2] (✈️..✉️) airplane..envelope
|
|
||||||
270A..270B ; Emoji # 6.0 [2] (✊..✋) raised fist..raised hand
|
|
||||||
270C..270D ; Emoji # 1.1 [2] (✌️..✍️) victory hand..writing hand
|
|
||||||
270F ; Emoji # 1.1 [1] (✏️) pencil
|
|
||||||
2712 ; Emoji # 1.1 [1] (✒️) black nib
|
|
||||||
2714 ; Emoji # 1.1 [1] (✔️) check mark
|
|
||||||
2716 ; Emoji # 1.1 [1] (✖️) multiplication sign
|
|
||||||
271D ; Emoji # 1.1 [1] (✝️) latin cross
|
|
||||||
2721 ; Emoji # 1.1 [1] (✡️) star of David
|
|
||||||
2728 ; Emoji # 6.0 [1] (✨) sparkles
|
|
||||||
2733..2734 ; Emoji # 1.1 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
|
|
||||||
2744 ; Emoji # 1.1 [1] (❄️) snowflake
|
|
||||||
2747 ; Emoji # 1.1 [1] (❇️) sparkle
|
|
||||||
274C ; Emoji # 6.0 [1] (❌) cross mark
|
|
||||||
274E ; Emoji # 6.0 [1] (❎) cross mark button
|
|
||||||
2753..2755 ; Emoji # 6.0 [3] (❓..❕) question mark..white exclamation mark
|
|
||||||
2757 ; Emoji # 5.2 [1] (❗) exclamation mark
|
|
||||||
2763..2764 ; Emoji # 1.1 [2] (❣️..❤️) heart exclamation..red heart
|
|
||||||
2795..2797 ; Emoji # 6.0 [3] (➕..➗) plus sign..division sign
|
|
||||||
27A1 ; Emoji # 1.1 [1] (➡️) right arrow
|
|
||||||
27B0 ; Emoji # 6.0 [1] (➰) curly loop
|
|
||||||
27BF ; Emoji # 6.0 [1] (➿) double curly loop
|
|
||||||
2934..2935 ; Emoji # 3.2 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
|
|
||||||
2B05..2B07 ; Emoji # 4.0 [3] (⬅️..⬇️) left arrow..down arrow
|
|
||||||
2B1B..2B1C ; Emoji # 5.1 [2] (⬛..⬜) black large square..white large square
|
|
||||||
2B50 ; Emoji # 5.1 [1] (⭐) star
|
|
||||||
2B55 ; Emoji # 5.2 [1] (⭕) hollow red circle
|
|
||||||
3030 ; Emoji # 1.1 [1] (〰️) wavy dash
|
|
||||||
303D ; Emoji # 3.2 [1] (〽️) part alternation mark
|
|
||||||
3297 ; Emoji # 1.1 [1] (㊗️) Japanese “congratulations” button
|
|
||||||
3299 ; Emoji # 1.1 [1] (㊙️) Japanese “secret” button
|
|
||||||
1F004 ; Emoji # 5.1 [1] (🀄) mahjong red dragon
|
|
||||||
1F0CF ; Emoji # 6.0 [1] (🃏) joker
|
|
||||||
1F170..1F171 ; Emoji # 6.0 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
|
|
||||||
1F17E ; Emoji # 6.0 [1] (🅾️) O button (blood type)
|
|
||||||
1F17F ; Emoji # 5.2 [1] (🅿️) P button
|
|
||||||
1F18E ; Emoji # 6.0 [1] (🆎) AB button (blood type)
|
|
||||||
1F191..1F19A ; Emoji # 6.0 [10] (🆑..🆚) CL button..VS button
|
|
||||||
1F1E6..1F1FF ; Emoji # 6.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
|
|
||||||
1F201..1F202 ; Emoji # 6.0 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
|
|
||||||
1F21A ; Emoji # 5.2 [1] (🈚) Japanese “free of charge” button
|
|
||||||
1F22F ; Emoji # 5.2 [1] (🈯) Japanese “reserved” button
|
|
||||||
1F232..1F23A ; Emoji # 6.0 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
|
|
||||||
1F250..1F251 ; Emoji # 6.0 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
|
|
||||||
1F300..1F320 ; Emoji # 6.0 [33] (🌀..🌠) cyclone..shooting star
|
|
||||||
1F321 ; Emoji # 7.0 [1] (🌡️) thermometer
|
|
||||||
1F324..1F32C ; Emoji # 7.0 [9] (🌤️..🌬️) sun behind small cloud..wind face
|
|
||||||
1F32D..1F32F ; Emoji # 8.0 [3] (🌭..🌯) hot dog..burrito
|
|
||||||
1F330..1F335 ; Emoji # 6.0 [6] (🌰..🌵) chestnut..cactus
|
|
||||||
1F336 ; Emoji # 7.0 [1] (🌶️) hot pepper
|
|
||||||
1F337..1F37C ; Emoji # 6.0 [70] (🌷..🍼) tulip..baby bottle
|
|
||||||
1F37D ; Emoji # 7.0 [1] (🍽️) fork and knife with plate
|
|
||||||
1F37E..1F37F ; Emoji # 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn
|
|
||||||
1F380..1F393 ; Emoji # 6.0 [20] (🎀..🎓) ribbon..graduation cap
|
|
||||||
1F396..1F397 ; Emoji # 7.0 [2] (🎖️..🎗️) military medal..reminder ribbon
|
|
||||||
1F399..1F39B ; Emoji # 7.0 [3] (🎙️..🎛️) studio microphone..control knobs
|
|
||||||
1F39E..1F39F ; Emoji # 7.0 [2] (🎞️..🎟️) film frames..admission tickets
|
|
||||||
1F3A0..1F3C4 ; Emoji # 6.0 [37] (🎠..🏄) carousel horse..person surfing
|
|
||||||
1F3C5 ; Emoji # 7.0 [1] (🏅) sports medal
|
|
||||||
1F3C6..1F3CA ; Emoji # 6.0 [5] (🏆..🏊) trophy..person swimming
|
|
||||||
1F3CB..1F3CE ; Emoji # 7.0 [4] (🏋️..🏎️) person lifting weights..racing car
|
|
||||||
1F3CF..1F3D3 ; Emoji # 8.0 [5] (🏏..🏓) cricket game..ping pong
|
|
||||||
1F3D4..1F3DF ; Emoji # 7.0 [12] (🏔️..🏟️) snow-capped mountain..stadium
|
|
||||||
1F3E0..1F3F0 ; Emoji # 6.0 [17] (🏠..🏰) house..castle
|
|
||||||
1F3F3..1F3F5 ; Emoji # 7.0 [3] (🏳️..🏵️) white flag..rosette
|
|
||||||
1F3F7 ; Emoji # 7.0 [1] (🏷️) label
|
|
||||||
1F3F8..1F3FF ; Emoji # 8.0 [8] (🏸..🏿) badminton..dark skin tone
|
|
||||||
1F400..1F43E ; Emoji # 6.0 [63] (🐀..🐾) rat..paw prints
|
|
||||||
1F43F ; Emoji # 7.0 [1] (🐿️) chipmunk
|
|
||||||
1F440 ; Emoji # 6.0 [1] (👀) eyes
|
|
||||||
1F441 ; Emoji # 7.0 [1] (👁️) eye
|
|
||||||
1F442..1F4F7 ; Emoji # 6.0[182] (👂..📷) ear..camera
|
|
||||||
1F4F8 ; Emoji # 7.0 [1] (📸) camera with flash
|
|
||||||
1F4F9..1F4FC ; Emoji # 6.0 [4] (📹..📼) video camera..videocassette
|
|
||||||
1F4FD ; Emoji # 7.0 [1] (📽️) film projector
|
|
||||||
1F4FF ; Emoji # 8.0 [1] (📿) prayer beads
|
|
||||||
1F500..1F53D ; Emoji # 6.0 [62] (🔀..🔽) shuffle tracks button..downwards button
|
|
||||||
1F549..1F54A ; Emoji # 7.0 [2] (🕉️..🕊️) om..dove
|
|
||||||
1F54B..1F54E ; Emoji # 8.0 [4] (🕋..🕎) kaaba..menorah
|
|
||||||
1F550..1F567 ; Emoji # 6.0 [24] (🕐..🕧) one o’clock..twelve-thirty
|
|
||||||
1F56F..1F570 ; Emoji # 7.0 [2] (🕯️..🕰️) candle..mantelpiece clock
|
|
||||||
1F573..1F579 ; Emoji # 7.0 [7] (🕳️..🕹️) hole..joystick
|
|
||||||
1F57A ; Emoji # 9.0 [1] (🕺) man dancing
|
|
||||||
1F587 ; Emoji # 7.0 [1] (🖇️) linked paperclips
|
|
||||||
1F58A..1F58D ; Emoji # 7.0 [4] (🖊️..🖍️) pen..crayon
|
|
||||||
1F590 ; Emoji # 7.0 [1] (🖐️) hand with fingers splayed
|
|
||||||
1F595..1F596 ; Emoji # 7.0 [2] (🖕..🖖) middle finger..vulcan salute
|
|
||||||
1F5A4 ; Emoji # 9.0 [1] (🖤) black heart
|
|
||||||
1F5A5 ; Emoji # 7.0 [1] (🖥️) desktop computer
|
|
||||||
1F5A8 ; Emoji # 7.0 [1] (🖨️) printer
|
|
||||||
1F5B1..1F5B2 ; Emoji # 7.0 [2] (🖱️..🖲️) computer mouse..trackball
|
|
||||||
1F5BC ; Emoji # 7.0 [1] (🖼️) framed picture
|
|
||||||
1F5C2..1F5C4 ; Emoji # 7.0 [3] (🗂️..🗄️) card index dividers..file cabinet
|
|
||||||
1F5D1..1F5D3 ; Emoji # 7.0 [3] (🗑️..🗓️) wastebasket..spiral calendar
|
|
||||||
1F5DC..1F5DE ; Emoji # 7.0 [3] (🗜️..🗞️) clamp..rolled-up newspaper
|
|
||||||
1F5E1 ; Emoji # 7.0 [1] (🗡️) dagger
|
|
||||||
1F5E3 ; Emoji # 7.0 [1] (🗣️) speaking head
|
|
||||||
1F5E8 ; Emoji # 7.0 [1] (🗨️) left speech bubble
|
|
||||||
1F5EF ; Emoji # 7.0 [1] (🗯️) right anger bubble
|
|
||||||
1F5F3 ; Emoji # 7.0 [1] (🗳️) ballot box with ballot
|
|
||||||
1F5FA ; Emoji # 7.0 [1] (🗺️) world map
|
|
||||||
1F5FB..1F5FF ; Emoji # 6.0 [5] (🗻..🗿) mount fuji..moai
|
|
||||||
1F600 ; Emoji # 6.1 [1] (😀) grinning face
|
|
||||||
1F601..1F610 ; Emoji # 6.0 [16] (😁..😐) beaming face with smiling eyes..neutral face
|
|
||||||
1F611 ; Emoji # 6.1 [1] (😑) expressionless face
|
|
||||||
1F612..1F614 ; Emoji # 6.0 [3] (😒..😔) unamused face..pensive face
|
|
||||||
1F615 ; Emoji # 6.1 [1] (😕) confused face
|
|
||||||
1F616 ; Emoji # 6.0 [1] (😖) confounded face
|
|
||||||
1F617 ; Emoji # 6.1 [1] (😗) kissing face
|
|
||||||
1F618 ; Emoji # 6.0 [1] (😘) face blowing a kiss
|
|
||||||
1F619 ; Emoji # 6.1 [1] (😙) kissing face with smiling eyes
|
|
||||||
1F61A ; Emoji # 6.0 [1] (😚) kissing face with closed eyes
|
|
||||||
1F61B ; Emoji # 6.1 [1] (😛) face with tongue
|
|
||||||
1F61C..1F61E ; Emoji # 6.0 [3] (😜..😞) winking face with tongue..disappointed face
|
|
||||||
1F61F ; Emoji # 6.1 [1] (😟) worried face
|
|
||||||
1F620..1F625 ; Emoji # 6.0 [6] (😠..😥) angry face..sad but relieved face
|
|
||||||
1F626..1F627 ; Emoji # 6.1 [2] (😦..😧) frowning face with open mouth..anguished face
|
|
||||||
1F628..1F62B ; Emoji # 6.0 [4] (😨..😫) fearful face..tired face
|
|
||||||
1F62C ; Emoji # 6.1 [1] (😬) grimacing face
|
|
||||||
1F62D ; Emoji # 6.0 [1] (😭) loudly crying face
|
|
||||||
1F62E..1F62F ; Emoji # 6.1 [2] (😮..😯) face with open mouth..hushed face
|
|
||||||
1F630..1F633 ; Emoji # 6.0 [4] (😰..😳) anxious face with sweat..flushed face
|
|
||||||
1F634 ; Emoji # 6.1 [1] (😴) sleeping face
|
|
||||||
1F635..1F640 ; Emoji # 6.0 [12] (😵..🙀) dizzy face..weary cat
|
|
||||||
1F641..1F642 ; Emoji # 7.0 [2] (🙁..🙂) slightly frowning face..slightly smiling face
|
|
||||||
1F643..1F644 ; Emoji # 8.0 [2] (🙃..🙄) upside-down face..face with rolling eyes
|
|
||||||
1F645..1F64F ; Emoji # 6.0 [11] (🙅..🙏) person gesturing NO..folded hands
|
|
||||||
1F680..1F6C5 ; Emoji # 6.0 [70] (🚀..🛅) rocket..left luggage
|
|
||||||
1F6CB..1F6CF ; Emoji # 7.0 [5] (🛋️..🛏️) couch and lamp..bed
|
|
||||||
1F6D0 ; Emoji # 8.0 [1] (🛐) place of worship
|
|
||||||
1F6D1..1F6D2 ; Emoji # 9.0 [2] (🛑..🛒) stop sign..shopping cart
|
|
||||||
1F6D5 ; Emoji # 12.0 [1] (🛕) hindu temple
|
|
||||||
1F6E0..1F6E5 ; Emoji # 7.0 [6] (🛠️..🛥️) hammer and wrench..motor boat
|
|
||||||
1F6E9 ; Emoji # 7.0 [1] (🛩️) small airplane
|
|
||||||
1F6EB..1F6EC ; Emoji # 7.0 [2] (🛫..🛬) airplane departure..airplane arrival
|
|
||||||
1F6F0 ; Emoji # 7.0 [1] (🛰️) satellite
|
|
||||||
1F6F3 ; Emoji # 7.0 [1] (🛳️) passenger ship
|
|
||||||
1F6F4..1F6F6 ; Emoji # 9.0 [3] (🛴..🛶) kick scooter..canoe
|
|
||||||
1F6F7..1F6F8 ; Emoji # 10.0 [2] (🛷..🛸) sled..flying saucer
|
|
||||||
1F6F9 ; Emoji # 11.0 [1] (🛹) skateboard
|
|
||||||
1F6FA ; Emoji # 12.0 [1] (🛺) auto rickshaw
|
|
||||||
1F7E0..1F7EB ; Emoji # 12.0 [12] (🟠..🟫) orange circle..brown square
|
|
||||||
1F90D..1F90F ; Emoji # 12.0 [3] (🤍..🤏) white heart..pinching hand
|
|
||||||
1F910..1F918 ; Emoji # 8.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
|
|
||||||
1F919..1F91E ; Emoji # 9.0 [6] (🤙..🤞) call me hand..crossed fingers
|
|
||||||
1F91F ; Emoji # 10.0 [1] (🤟) love-you gesture
|
|
||||||
1F920..1F927 ; Emoji # 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face
|
|
||||||
1F928..1F92F ; Emoji # 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
|
|
||||||
1F930 ; Emoji # 9.0 [1] (🤰) pregnant woman
|
|
||||||
1F931..1F932 ; Emoji # 10.0 [2] (🤱..🤲) breast-feeding..palms up together
|
|
||||||
1F933..1F93A ; Emoji # 9.0 [8] (🤳..🤺) selfie..person fencing
|
|
||||||
1F93C..1F93E ; Emoji # 9.0 [3] (🤼..🤾) people wrestling..person playing handball
|
|
||||||
1F93F ; Emoji # 12.0 [1] (🤿) diving mask
|
|
||||||
1F940..1F945 ; Emoji # 9.0 [6] (🥀..🥅) wilted flower..goal net
|
|
||||||
1F947..1F94B ; Emoji # 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
|
|
||||||
1F94C ; Emoji # 10.0 [1] (🥌) curling stone
|
|
||||||
1F94D..1F94F ; Emoji # 11.0 [3] (🥍..🥏) lacrosse..flying disc
|
|
||||||
1F950..1F95E ; Emoji # 9.0 [15] (🥐..🥞) croissant..pancakes
|
|
||||||
1F95F..1F96B ; Emoji # 10.0 [13] (🥟..🥫) dumpling..canned food
|
|
||||||
1F96C..1F970 ; Emoji # 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
|
|
||||||
1F971 ; Emoji # 12.0 [1] (🥱) yawning face
|
|
||||||
1F973..1F976 ; Emoji # 11.0 [4] (🥳..🥶) partying face..cold face
|
|
||||||
1F97A ; Emoji # 11.0 [1] (🥺) pleading face
|
|
||||||
1F97B ; Emoji # 12.0 [1] (🥻) sari
|
|
||||||
1F97C..1F97F ; Emoji # 11.0 [4] (🥼..🥿) lab coat..flat shoe
|
|
||||||
1F980..1F984 ; Emoji # 8.0 [5] (🦀..🦄) crab..unicorn
|
|
||||||
1F985..1F991 ; Emoji # 9.0 [13] (🦅..🦑) eagle..squid
|
|
||||||
1F992..1F997 ; Emoji # 10.0 [6] (🦒..🦗) giraffe..cricket
|
|
||||||
1F998..1F9A2 ; Emoji # 11.0 [11] (🦘..🦢) kangaroo..swan
|
|
||||||
1F9A5..1F9AA ; Emoji # 12.0 [6] (🦥..🦪) sloth..oyster
|
|
||||||
1F9AE..1F9AF ; Emoji # 12.0 [2] (🦮..🦯) guide dog..probing cane
|
|
||||||
1F9B0..1F9B9 ; Emoji # 11.0 [10] (🦰..🦹) red hair..supervillain
|
|
||||||
1F9BA..1F9BF ; Emoji # 12.0 [6] (🦺..🦿) safety vest..mechanical leg
|
|
||||||
1F9C0 ; Emoji # 8.0 [1] (🧀) cheese wedge
|
|
||||||
1F9C1..1F9C2 ; Emoji # 11.0 [2] (🧁..🧂) cupcake..salt
|
|
||||||
1F9C3..1F9CA ; Emoji # 12.0 [8] (🧃..🧊) beverage box..ice cube
|
|
||||||
1F9CD..1F9CF ; Emoji # 12.0 [3] (🧍..🧏) person standing..deaf person
|
|
||||||
1F9D0..1F9E6 ; Emoji # 10.0 [23] (🧐..🧦) face with monocle..socks
|
|
||||||
1F9E7..1F9FF ; Emoji # 11.0 [25] (🧧..🧿) red envelope..nazar amulet
|
|
||||||
1FA70..1FA73 ; Emoji # 12.0 [4] (🩰..🩳) ballet shoes..shorts
|
|
||||||
1FA78..1FA7A ; Emoji # 12.0 [3] (🩸..🩺) drop of blood..stethoscope
|
|
||||||
1FA80..1FA82 ; Emoji # 12.0 [3] (🪀..🪂) yo-yo..parachute
|
|
||||||
1FA90..1FA95 ; Emoji # 12.0 [6] (🪐..🪕) ringed planet..banjo
|
|
||||||
|
|
||||||
# Total elements: 1311
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Emoji_Presentation=No
|
|
||||||
# @missing: 0000..10FFFF ; Emoji_Presentation ; No
|
|
||||||
|
|
||||||
231A..231B ; Emoji_Presentation # 1.1 [2] (⌚..⌛) watch..hourglass done
|
|
||||||
23E9..23EC ; Emoji_Presentation # 6.0 [4] (⏩..⏬) fast-forward button..fast down button
|
|
||||||
23F0 ; Emoji_Presentation # 6.0 [1] (⏰) alarm clock
|
|
||||||
23F3 ; Emoji_Presentation # 6.0 [1] (⏳) hourglass not done
|
|
||||||
25FD..25FE ; Emoji_Presentation # 3.2 [2] (◽..◾) white medium-small square..black medium-small square
|
|
||||||
2614..2615 ; Emoji_Presentation # 4.0 [2] (☔..☕) umbrella with rain drops..hot beverage
|
|
||||||
2648..2653 ; Emoji_Presentation # 1.1 [12] (♈..♓) Aries..Pisces
|
|
||||||
267F ; Emoji_Presentation # 4.1 [1] (♿) wheelchair symbol
|
|
||||||
2693 ; Emoji_Presentation # 4.1 [1] (⚓) anchor
|
|
||||||
26A1 ; Emoji_Presentation # 4.0 [1] (⚡) high voltage
|
|
||||||
26AA..26AB ; Emoji_Presentation # 4.1 [2] (⚪..⚫) white circle..black circle
|
|
||||||
26BD..26BE ; Emoji_Presentation # 5.2 [2] (⚽..⚾) soccer ball..baseball
|
|
||||||
26C4..26C5 ; Emoji_Presentation # 5.2 [2] (⛄..⛅) snowman without snow..sun behind cloud
|
|
||||||
26CE ; Emoji_Presentation # 6.0 [1] (⛎) Ophiuchus
|
|
||||||
26D4 ; Emoji_Presentation # 5.2 [1] (⛔) no entry
|
|
||||||
26EA ; Emoji_Presentation # 5.2 [1] (⛪) church
|
|
||||||
26F2..26F3 ; Emoji_Presentation # 5.2 [2] (⛲..⛳) fountain..flag in hole
|
|
||||||
26F5 ; Emoji_Presentation # 5.2 [1] (⛵) sailboat
|
|
||||||
26FA ; Emoji_Presentation # 5.2 [1] (⛺) tent
|
|
||||||
26FD ; Emoji_Presentation # 5.2 [1] (⛽) fuel pump
|
|
||||||
2705 ; Emoji_Presentation # 6.0 [1] (✅) check mark button
|
|
||||||
270A..270B ; Emoji_Presentation # 6.0 [2] (✊..✋) raised fist..raised hand
|
|
||||||
2728 ; Emoji_Presentation # 6.0 [1] (✨) sparkles
|
|
||||||
274C ; Emoji_Presentation # 6.0 [1] (❌) cross mark
|
|
||||||
274E ; Emoji_Presentation # 6.0 [1] (❎) cross mark button
|
|
||||||
2753..2755 ; Emoji_Presentation # 6.0 [3] (❓..❕) question mark..white exclamation mark
|
|
||||||
2757 ; Emoji_Presentation # 5.2 [1] (❗) exclamation mark
|
|
||||||
2795..2797 ; Emoji_Presentation # 6.0 [3] (➕..➗) plus sign..division sign
|
|
||||||
27B0 ; Emoji_Presentation # 6.0 [1] (➰) curly loop
|
|
||||||
27BF ; Emoji_Presentation # 6.0 [1] (➿) double curly loop
|
|
||||||
2B1B..2B1C ; Emoji_Presentation # 5.1 [2] (⬛..⬜) black large square..white large square
|
|
||||||
2B50 ; Emoji_Presentation # 5.1 [1] (⭐) star
|
|
||||||
2B55 ; Emoji_Presentation # 5.2 [1] (⭕) hollow red circle
|
|
||||||
1F004 ; Emoji_Presentation # 5.1 [1] (🀄) mahjong red dragon
|
|
||||||
1F0CF ; Emoji_Presentation # 6.0 [1] (🃏) joker
|
|
||||||
1F18E ; Emoji_Presentation # 6.0 [1] (🆎) AB button (blood type)
|
|
||||||
1F191..1F19A ; Emoji_Presentation # 6.0 [10] (🆑..🆚) CL button..VS button
|
|
||||||
1F1E6..1F1FF ; Emoji_Presentation # 6.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
|
|
||||||
1F201 ; Emoji_Presentation # 6.0 [1] (🈁) Japanese “here” button
|
|
||||||
1F21A ; Emoji_Presentation # 5.2 [1] (🈚) Japanese “free of charge” button
|
|
||||||
1F22F ; Emoji_Presentation # 5.2 [1] (🈯) Japanese “reserved” button
|
|
||||||
1F232..1F236 ; Emoji_Presentation # 6.0 [5] (🈲..🈶) Japanese “prohibited” button..Japanese “not free of charge” button
|
|
||||||
1F238..1F23A ; Emoji_Presentation # 6.0 [3] (🈸..🈺) Japanese “application” button..Japanese “open for business” button
|
|
||||||
1F250..1F251 ; Emoji_Presentation # 6.0 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
|
|
||||||
1F300..1F320 ; Emoji_Presentation # 6.0 [33] (🌀..🌠) cyclone..shooting star
|
|
||||||
1F32D..1F32F ; Emoji_Presentation # 8.0 [3] (🌭..🌯) hot dog..burrito
|
|
||||||
1F330..1F335 ; Emoji_Presentation # 6.0 [6] (🌰..🌵) chestnut..cactus
|
|
||||||
1F337..1F37C ; Emoji_Presentation # 6.0 [70] (🌷..🍼) tulip..baby bottle
|
|
||||||
1F37E..1F37F ; Emoji_Presentation # 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn
|
|
||||||
1F380..1F393 ; Emoji_Presentation # 6.0 [20] (🎀..🎓) ribbon..graduation cap
|
|
||||||
1F3A0..1F3C4 ; Emoji_Presentation # 6.0 [37] (🎠..🏄) carousel horse..person surfing
|
|
||||||
1F3C5 ; Emoji_Presentation # 7.0 [1] (🏅) sports medal
|
|
||||||
1F3C6..1F3CA ; Emoji_Presentation # 6.0 [5] (🏆..🏊) trophy..person swimming
|
|
||||||
1F3CF..1F3D3 ; Emoji_Presentation # 8.0 [5] (🏏..🏓) cricket game..ping pong
|
|
||||||
1F3E0..1F3F0 ; Emoji_Presentation # 6.0 [17] (🏠..🏰) house..castle
|
|
||||||
1F3F4 ; Emoji_Presentation # 7.0 [1] (🏴) black flag
|
|
||||||
1F3F8..1F3FF ; Emoji_Presentation # 8.0 [8] (🏸..🏿) badminton..dark skin tone
|
|
||||||
1F400..1F43E ; Emoji_Presentation # 6.0 [63] (🐀..🐾) rat..paw prints
|
|
||||||
1F440 ; Emoji_Presentation # 6.0 [1] (👀) eyes
|
|
||||||
1F442..1F4F7 ; Emoji_Presentation # 6.0[182] (👂..📷) ear..camera
|
|
||||||
1F4F8 ; Emoji_Presentation # 7.0 [1] (📸) camera with flash
|
|
||||||
1F4F9..1F4FC ; Emoji_Presentation # 6.0 [4] (📹..📼) video camera..videocassette
|
|
||||||
1F4FF ; Emoji_Presentation # 8.0 [1] (📿) prayer beads
|
|
||||||
1F500..1F53D ; Emoji_Presentation # 6.0 [62] (🔀..🔽) shuffle tracks button..downwards button
|
|
||||||
1F54B..1F54E ; Emoji_Presentation # 8.0 [4] (🕋..🕎) kaaba..menorah
|
|
||||||
1F550..1F567 ; Emoji_Presentation # 6.0 [24] (🕐..🕧) one o’clock..twelve-thirty
|
|
||||||
1F57A ; Emoji_Presentation # 9.0 [1] (🕺) man dancing
|
|
||||||
1F595..1F596 ; Emoji_Presentation # 7.0 [2] (🖕..🖖) middle finger..vulcan salute
|
|
||||||
1F5A4 ; Emoji_Presentation # 9.0 [1] (🖤) black heart
|
|
||||||
1F5FB..1F5FF ; Emoji_Presentation # 6.0 [5] (🗻..🗿) mount fuji..moai
|
|
||||||
1F600 ; Emoji_Presentation # 6.1 [1] (😀) grinning face
|
|
||||||
1F601..1F610 ; Emoji_Presentation # 6.0 [16] (😁..😐) beaming face with smiling eyes..neutral face
|
|
||||||
1F611 ; Emoji_Presentation # 6.1 [1] (😑) expressionless face
|
|
||||||
1F612..1F614 ; Emoji_Presentation # 6.0 [3] (😒..😔) unamused face..pensive face
|
|
||||||
1F615 ; Emoji_Presentation # 6.1 [1] (😕) confused face
|
|
||||||
1F616 ; Emoji_Presentation # 6.0 [1] (😖) confounded face
|
|
||||||
1F617 ; Emoji_Presentation # 6.1 [1] (😗) kissing face
|
|
||||||
1F618 ; Emoji_Presentation # 6.0 [1] (😘) face blowing a kiss
|
|
||||||
1F619 ; Emoji_Presentation # 6.1 [1] (😙) kissing face with smiling eyes
|
|
||||||
1F61A ; Emoji_Presentation # 6.0 [1] (😚) kissing face with closed eyes
|
|
||||||
1F61B ; Emoji_Presentation # 6.1 [1] (😛) face with tongue
|
|
||||||
1F61C..1F61E ; Emoji_Presentation # 6.0 [3] (😜..😞) winking face with tongue..disappointed face
|
|
||||||
1F61F ; Emoji_Presentation # 6.1 [1] (😟) worried face
|
|
||||||
1F620..1F625 ; Emoji_Presentation # 6.0 [6] (😠..😥) angry face..sad but relieved face
|
|
||||||
1F626..1F627 ; Emoji_Presentation # 6.1 [2] (😦..😧) frowning face with open mouth..anguished face
|
|
||||||
1F628..1F62B ; Emoji_Presentation # 6.0 [4] (😨..😫) fearful face..tired face
|
|
||||||
1F62C ; Emoji_Presentation # 6.1 [1] (😬) grimacing face
|
|
||||||
1F62D ; Emoji_Presentation # 6.0 [1] (😭) loudly crying face
|
|
||||||
1F62E..1F62F ; Emoji_Presentation # 6.1 [2] (😮..😯) face with open mouth..hushed face
|
|
||||||
1F630..1F633 ; Emoji_Presentation # 6.0 [4] (😰..😳) anxious face with sweat..flushed face
|
|
||||||
1F634 ; Emoji_Presentation # 6.1 [1] (😴) sleeping face
|
|
||||||
1F635..1F640 ; Emoji_Presentation # 6.0 [12] (😵..🙀) dizzy face..weary cat
|
|
||||||
1F641..1F642 ; Emoji_Presentation # 7.0 [2] (🙁..🙂) slightly frowning face..slightly smiling face
|
|
||||||
1F643..1F644 ; Emoji_Presentation # 8.0 [2] (🙃..🙄) upside-down face..face with rolling eyes
|
|
||||||
1F645..1F64F ; Emoji_Presentation # 6.0 [11] (🙅..🙏) person gesturing NO..folded hands
|
|
||||||
1F680..1F6C5 ; Emoji_Presentation # 6.0 [70] (🚀..🛅) rocket..left luggage
|
|
||||||
1F6CC ; Emoji_Presentation # 7.0 [1] (🛌) person in bed
|
|
||||||
1F6D0 ; Emoji_Presentation # 8.0 [1] (🛐) place of worship
|
|
||||||
1F6D1..1F6D2 ; Emoji_Presentation # 9.0 [2] (🛑..🛒) stop sign..shopping cart
|
|
||||||
1F6D5 ; Emoji_Presentation # 12.0 [1] (🛕) hindu temple
|
|
||||||
1F6EB..1F6EC ; Emoji_Presentation # 7.0 [2] (🛫..🛬) airplane departure..airplane arrival
|
|
||||||
1F6F4..1F6F6 ; Emoji_Presentation # 9.0 [3] (🛴..🛶) kick scooter..canoe
|
|
||||||
1F6F7..1F6F8 ; Emoji_Presentation # 10.0 [2] (🛷..🛸) sled..flying saucer
|
|
||||||
1F6F9 ; Emoji_Presentation # 11.0 [1] (🛹) skateboard
|
|
||||||
1F6FA ; Emoji_Presentation # 12.0 [1] (🛺) auto rickshaw
|
|
||||||
1F7E0..1F7EB ; Emoji_Presentation # 12.0 [12] (🟠..🟫) orange circle..brown square
|
|
||||||
1F90D..1F90F ; Emoji_Presentation # 12.0 [3] (🤍..🤏) white heart..pinching hand
|
|
||||||
1F910..1F918 ; Emoji_Presentation # 8.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
|
|
||||||
1F919..1F91E ; Emoji_Presentation # 9.0 [6] (🤙..🤞) call me hand..crossed fingers
|
|
||||||
1F91F ; Emoji_Presentation # 10.0 [1] (🤟) love-you gesture
|
|
||||||
1F920..1F927 ; Emoji_Presentation # 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face
|
|
||||||
1F928..1F92F ; Emoji_Presentation # 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
|
|
||||||
1F930 ; Emoji_Presentation # 9.0 [1] (🤰) pregnant woman
|
|
||||||
1F931..1F932 ; Emoji_Presentation # 10.0 [2] (🤱..🤲) breast-feeding..palms up together
|
|
||||||
1F933..1F93A ; Emoji_Presentation # 9.0 [8] (🤳..🤺) selfie..person fencing
|
|
||||||
1F93C..1F93E ; Emoji_Presentation # 9.0 [3] (🤼..🤾) people wrestling..person playing handball
|
|
||||||
1F93F ; Emoji_Presentation # 12.0 [1] (🤿) diving mask
|
|
||||||
1F940..1F945 ; Emoji_Presentation # 9.0 [6] (🥀..🥅) wilted flower..goal net
|
|
||||||
1F947..1F94B ; Emoji_Presentation # 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
|
|
||||||
1F94C ; Emoji_Presentation # 10.0 [1] (🥌) curling stone
|
|
||||||
1F94D..1F94F ; Emoji_Presentation # 11.0 [3] (🥍..🥏) lacrosse..flying disc
|
|
||||||
1F950..1F95E ; Emoji_Presentation # 9.0 [15] (🥐..🥞) croissant..pancakes
|
|
||||||
1F95F..1F96B ; Emoji_Presentation # 10.0 [13] (🥟..🥫) dumpling..canned food
|
|
||||||
1F96C..1F970 ; Emoji_Presentation # 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
|
|
||||||
1F971 ; Emoji_Presentation # 12.0 [1] (🥱) yawning face
|
|
||||||
1F973..1F976 ; Emoji_Presentation # 11.0 [4] (🥳..🥶) partying face..cold face
|
|
||||||
1F97A ; Emoji_Presentation # 11.0 [1] (🥺) pleading face
|
|
||||||
1F97B ; Emoji_Presentation # 12.0 [1] (🥻) sari
|
|
||||||
1F97C..1F97F ; Emoji_Presentation # 11.0 [4] (🥼..🥿) lab coat..flat shoe
|
|
||||||
1F980..1F984 ; Emoji_Presentation # 8.0 [5] (🦀..🦄) crab..unicorn
|
|
||||||
1F985..1F991 ; Emoji_Presentation # 9.0 [13] (🦅..🦑) eagle..squid
|
|
||||||
1F992..1F997 ; Emoji_Presentation # 10.0 [6] (🦒..🦗) giraffe..cricket
|
|
||||||
1F998..1F9A2 ; Emoji_Presentation # 11.0 [11] (🦘..🦢) kangaroo..swan
|
|
||||||
1F9A5..1F9AA ; Emoji_Presentation # 12.0 [6] (🦥..🦪) sloth..oyster
|
|
||||||
1F9AE..1F9AF ; Emoji_Presentation # 12.0 [2] (🦮..🦯) guide dog..probing cane
|
|
||||||
1F9B0..1F9B9 ; Emoji_Presentation # 11.0 [10] (🦰..🦹) red hair..supervillain
|
|
||||||
1F9BA..1F9BF ; Emoji_Presentation # 12.0 [6] (🦺..🦿) safety vest..mechanical leg
|
|
||||||
1F9C0 ; Emoji_Presentation # 8.0 [1] (🧀) cheese wedge
|
|
||||||
1F9C1..1F9C2 ; Emoji_Presentation # 11.0 [2] (🧁..🧂) cupcake..salt
|
|
||||||
1F9C3..1F9CA ; Emoji_Presentation # 12.0 [8] (🧃..🧊) beverage box..ice cube
|
|
||||||
1F9CD..1F9CF ; Emoji_Presentation # 12.0 [3] (🧍..🧏) person standing..deaf person
|
|
||||||
1F9D0..1F9E6 ; Emoji_Presentation # 10.0 [23] (🧐..🧦) face with monocle..socks
|
|
||||||
1F9E7..1F9FF ; Emoji_Presentation # 11.0 [25] (🧧..🧿) red envelope..nazar amulet
|
|
||||||
1FA70..1FA73 ; Emoji_Presentation # 12.0 [4] (🩰..🩳) ballet shoes..shorts
|
|
||||||
1FA78..1FA7A ; Emoji_Presentation # 12.0 [3] (🩸..🩺) drop of blood..stethoscope
|
|
||||||
1FA80..1FA82 ; Emoji_Presentation # 12.0 [3] (🪀..🪂) yo-yo..parachute
|
|
||||||
1FA90..1FA95 ; Emoji_Presentation # 12.0 [6] (🪐..🪕) ringed planet..banjo
|
|
||||||
|
|
||||||
# Total elements: 1093
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Emoji_Modifier=No
|
|
||||||
# @missing: 0000..10FFFF ; Emoji_Modifier ; No
|
|
||||||
|
|
||||||
1F3FB..1F3FF ; Emoji_Modifier # 8.0 [5] (🏻..🏿) light skin tone..dark skin tone
|
|
||||||
|
|
||||||
# Total elements: 5
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Emoji_Modifier_Base=No
|
|
||||||
# @missing: 0000..10FFFF ; Emoji_Modifier_Base ; No
|
|
||||||
|
|
||||||
261D ; Emoji_Modifier_Base # 1.1 [1] (☝️) index pointing up
|
|
||||||
26F9 ; Emoji_Modifier_Base # 5.2 [1] (⛹️) person bouncing ball
|
|
||||||
270A..270B ; Emoji_Modifier_Base # 6.0 [2] (✊..✋) raised fist..raised hand
|
|
||||||
270C..270D ; Emoji_Modifier_Base # 1.1 [2] (✌️..✍️) victory hand..writing hand
|
|
||||||
1F385 ; Emoji_Modifier_Base # 6.0 [1] (🎅) Santa Claus
|
|
||||||
1F3C2..1F3C4 ; Emoji_Modifier_Base # 6.0 [3] (🏂..🏄) snowboarder..person surfing
|
|
||||||
1F3C7 ; Emoji_Modifier_Base # 6.0 [1] (🏇) horse racing
|
|
||||||
1F3CA ; Emoji_Modifier_Base # 6.0 [1] (🏊) person swimming
|
|
||||||
1F3CB..1F3CC ; Emoji_Modifier_Base # 7.0 [2] (🏋️..🏌️) person lifting weights..person golfing
|
|
||||||
1F442..1F443 ; Emoji_Modifier_Base # 6.0 [2] (👂..👃) ear..nose
|
|
||||||
1F446..1F450 ; Emoji_Modifier_Base # 6.0 [11] (👆..👐) backhand index pointing up..open hands
|
|
||||||
1F466..1F478 ; Emoji_Modifier_Base # 6.0 [19] (👦..👸) boy..princess
|
|
||||||
1F47C ; Emoji_Modifier_Base # 6.0 [1] (👼) baby angel
|
|
||||||
1F481..1F483 ; Emoji_Modifier_Base # 6.0 [3] (💁..💃) person tipping hand..woman dancing
|
|
||||||
1F485..1F487 ; Emoji_Modifier_Base # 6.0 [3] (💅..💇) nail polish..person getting haircut
|
|
||||||
1F48F ; Emoji_Modifier_Base # 6.0 [1] (💏) kiss
|
|
||||||
1F491 ; Emoji_Modifier_Base # 6.0 [1] (💑) couple with heart
|
|
||||||
1F4AA ; Emoji_Modifier_Base # 6.0 [1] (💪) flexed biceps
|
|
||||||
1F574..1F575 ; Emoji_Modifier_Base # 7.0 [2] (🕴️..🕵️) man in suit levitating..detective
|
|
||||||
1F57A ; Emoji_Modifier_Base # 9.0 [1] (🕺) man dancing
|
|
||||||
1F590 ; Emoji_Modifier_Base # 7.0 [1] (🖐️) hand with fingers splayed
|
|
||||||
1F595..1F596 ; Emoji_Modifier_Base # 7.0 [2] (🖕..🖖) middle finger..vulcan salute
|
|
||||||
1F645..1F647 ; Emoji_Modifier_Base # 6.0 [3] (🙅..🙇) person gesturing NO..person bowing
|
|
||||||
1F64B..1F64F ; Emoji_Modifier_Base # 6.0 [5] (🙋..🙏) person raising hand..folded hands
|
|
||||||
1F6A3 ; Emoji_Modifier_Base # 6.0 [1] (🚣) person rowing boat
|
|
||||||
1F6B4..1F6B6 ; Emoji_Modifier_Base # 6.0 [3] (🚴..🚶) person biking..person walking
|
|
||||||
1F6C0 ; Emoji_Modifier_Base # 6.0 [1] (🛀) person taking bath
|
|
||||||
1F6CC ; Emoji_Modifier_Base # 7.0 [1] (🛌) person in bed
|
|
||||||
1F90F ; Emoji_Modifier_Base # 12.0 [1] (🤏) pinching hand
|
|
||||||
1F918 ; Emoji_Modifier_Base # 8.0 [1] (🤘) sign of the horns
|
|
||||||
1F919..1F91E ; Emoji_Modifier_Base # 9.0 [6] (🤙..🤞) call me hand..crossed fingers
|
|
||||||
1F91F ; Emoji_Modifier_Base # 10.0 [1] (🤟) love-you gesture
|
|
||||||
1F926 ; Emoji_Modifier_Base # 9.0 [1] (🤦) person facepalming
|
|
||||||
1F930 ; Emoji_Modifier_Base # 9.0 [1] (🤰) pregnant woman
|
|
||||||
1F931..1F932 ; Emoji_Modifier_Base # 10.0 [2] (🤱..🤲) breast-feeding..palms up together
|
|
||||||
1F933..1F939 ; Emoji_Modifier_Base # 9.0 [7] (🤳..🤹) selfie..person juggling
|
|
||||||
1F93C..1F93E ; Emoji_Modifier_Base # 9.0 [3] (🤼..🤾) people wrestling..person playing handball
|
|
||||||
1F9B5..1F9B6 ; Emoji_Modifier_Base # 11.0 [2] (🦵..🦶) leg..foot
|
|
||||||
1F9B8..1F9B9 ; Emoji_Modifier_Base # 11.0 [2] (🦸..🦹) superhero..supervillain
|
|
||||||
1F9BB ; Emoji_Modifier_Base # 12.0 [1] (🦻) ear with hearing aid
|
|
||||||
1F9CD..1F9CF ; Emoji_Modifier_Base # 12.0 [3] (🧍..🧏) person standing..deaf person
|
|
||||||
1F9D1..1F9DD ; Emoji_Modifier_Base # 10.0 [13] (🧑..🧝) person..elf
|
|
||||||
|
|
||||||
# Total elements: 120
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Emoji_Component=No
|
|
||||||
# @missing: 0000..10FFFF ; Emoji_Component ; No
|
|
||||||
|
|
||||||
0023 ; Emoji_Component # 1.1 [1] (#️) number sign
|
|
||||||
002A ; Emoji_Component # 1.1 [1] (*️) asterisk
|
|
||||||
0030..0039 ; Emoji_Component # 1.1 [10] (0️..9️) digit zero..digit nine
|
|
||||||
200D ; Emoji_Component # 1.1 [1] () zero width joiner
|
|
||||||
20E3 ; Emoji_Component # 3.0 [1] (⃣) combining enclosing keycap
|
|
||||||
FE0F ; Emoji_Component # 3.2 [1] () VARIATION SELECTOR-16
|
|
||||||
1F1E6..1F1FF ; Emoji_Component # 6.0 [26] (🇦..🇿) regional indicator symbol letter a..regional indicator symbol letter z
|
|
||||||
1F3FB..1F3FF ; Emoji_Component # 8.0 [5] (🏻..🏿) light skin tone..dark skin tone
|
|
||||||
1F9B0..1F9B3 ; Emoji_Component # 11.0 [4] (🦰..🦳) red hair..white hair
|
|
||||||
E0020..E007F ; Emoji_Component # 3.1 [96] (..) tag space..cancel tag
|
|
||||||
|
|
||||||
# Total elements: 146
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
# All omitted code points have Extended_Pictographic=No
|
|
||||||
# @missing: 0000..10FFFF ; Extended_Pictographic ; No
|
|
||||||
|
|
||||||
00A9 ; Extended_Pictographic# 1.1 [1] (©️) copyright
|
|
||||||
00AE ; Extended_Pictographic# 1.1 [1] (®️) registered
|
|
||||||
203C ; Extended_Pictographic# 1.1 [1] (‼️) double exclamation mark
|
|
||||||
2049 ; Extended_Pictographic# 3.0 [1] (⁉️) exclamation question mark
|
|
||||||
2122 ; Extended_Pictographic# 1.1 [1] (™️) trade mark
|
|
||||||
2139 ; Extended_Pictographic# 3.0 [1] (ℹ️) information
|
|
||||||
2194..2199 ; Extended_Pictographic# 1.1 [6] (↔️..↙️) left-right arrow..down-left arrow
|
|
||||||
21A9..21AA ; Extended_Pictographic# 1.1 [2] (↩️..↪️) right arrow curving left..left arrow curving right
|
|
||||||
231A..231B ; Extended_Pictographic# 1.1 [2] (⌚..⌛) watch..hourglass done
|
|
||||||
2328 ; Extended_Pictographic# 1.1 [1] (⌨️) keyboard
|
|
||||||
2388 ; Extended_Pictographic# 3.0 [1] (⎈) HELM SYMBOL
|
|
||||||
23CF ; Extended_Pictographic# 4.0 [1] (⏏️) eject button
|
|
||||||
23E9..23F3 ; Extended_Pictographic# 6.0 [11] (⏩..⏳) fast-forward button..hourglass not done
|
|
||||||
23F8..23FA ; Extended_Pictographic# 7.0 [3] (⏸️..⏺️) pause button..record button
|
|
||||||
24C2 ; Extended_Pictographic# 1.1 [1] (Ⓜ️) circled M
|
|
||||||
25AA..25AB ; Extended_Pictographic# 1.1 [2] (▪️..▫️) black small square..white small square
|
|
||||||
25B6 ; Extended_Pictographic# 1.1 [1] (▶️) play button
|
|
||||||
25C0 ; Extended_Pictographic# 1.1 [1] (◀️) reverse button
|
|
||||||
25FB..25FE ; Extended_Pictographic# 3.2 [4] (◻️..◾) white medium square..black medium-small square
|
|
||||||
2600..2605 ; Extended_Pictographic# 1.1 [6] (☀️..★) sun..BLACK STAR
|
|
||||||
2607..2612 ; Extended_Pictographic# 1.1 [12] (☇..☒) LIGHTNING..BALLOT BOX WITH X
|
|
||||||
2614..2615 ; Extended_Pictographic# 4.0 [2] (☔..☕) umbrella with rain drops..hot beverage
|
|
||||||
2616..2617 ; Extended_Pictographic# 3.2 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE
|
|
||||||
2618 ; Extended_Pictographic# 4.1 [1] (☘️) shamrock
|
|
||||||
2619 ; Extended_Pictographic# 3.0 [1] (☙) REVERSED ROTATED FLORAL HEART BULLET
|
|
||||||
261A..266F ; Extended_Pictographic# 1.1 [86] (☚..♯) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN
|
|
||||||
2670..2671 ; Extended_Pictographic# 3.0 [2] (♰..♱) WEST SYRIAC CROSS..EAST SYRIAC CROSS
|
|
||||||
2672..267D ; Extended_Pictographic# 3.2 [12] (♲..♽) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL
|
|
||||||
267E..267F ; Extended_Pictographic# 4.1 [2] (♾️..♿) infinity..wheelchair symbol
|
|
||||||
2680..2685 ; Extended_Pictographic# 3.2 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6
|
|
||||||
2690..2691 ; Extended_Pictographic# 4.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG
|
|
||||||
2692..269C ; Extended_Pictographic# 4.1 [11] (⚒️..⚜️) hammer and pick..fleur-de-lis
|
|
||||||
269D ; Extended_Pictographic# 5.1 [1] (⚝) OUTLINED WHITE STAR
|
|
||||||
269E..269F ; Extended_Pictographic# 5.2 [2] (⚞..⚟) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT
|
|
||||||
26A0..26A1 ; Extended_Pictographic# 4.0 [2] (⚠️..⚡) warning..high voltage
|
|
||||||
26A2..26B1 ; Extended_Pictographic# 4.1 [16] (⚢..⚱️) DOUBLED FEMALE SIGN..funeral urn
|
|
||||||
26B2 ; Extended_Pictographic# 5.0 [1] (⚲) NEUTER
|
|
||||||
26B3..26BC ; Extended_Pictographic# 5.1 [10] (⚳..⚼) CERES..SESQUIQUADRATE
|
|
||||||
26BD..26BF ; Extended_Pictographic# 5.2 [3] (⚽..⚿) soccer ball..SQUARED KEY
|
|
||||||
26C0..26C3 ; Extended_Pictographic# 5.1 [4] (⛀..⛃) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
|
|
||||||
26C4..26CD ; Extended_Pictographic# 5.2 [10] (⛄..⛍) snowman without snow..DISABLED CAR
|
|
||||||
26CE ; Extended_Pictographic# 6.0 [1] (⛎) Ophiuchus
|
|
||||||
26CF..26E1 ; Extended_Pictographic# 5.2 [19] (⛏️..⛡) pick..RESTRICTED LEFT ENTRY-2
|
|
||||||
26E2 ; Extended_Pictographic# 6.0 [1] (⛢) ASTRONOMICAL SYMBOL FOR URANUS
|
|
||||||
26E3 ; Extended_Pictographic# 5.2 [1] (⛣) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE
|
|
||||||
26E4..26E7 ; Extended_Pictographic# 6.0 [4] (⛤..⛧) PENTAGRAM..INVERTED PENTAGRAM
|
|
||||||
26E8..26FF ; Extended_Pictographic# 5.2 [24] (⛨..⛿) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE
|
|
||||||
2700 ; Extended_Pictographic# 7.0 [1] (✀) BLACK SAFETY SCISSORS
|
|
||||||
2701..2704 ; Extended_Pictographic# 1.1 [4] (✁..✄) UPPER BLADE SCISSORS..WHITE SCISSORS
|
|
||||||
2705 ; Extended_Pictographic# 6.0 [1] (✅) check mark button
|
|
||||||
2708..2709 ; Extended_Pictographic# 1.1 [2] (✈️..✉️) airplane..envelope
|
|
||||||
270A..270B ; Extended_Pictographic# 6.0 [2] (✊..✋) raised fist..raised hand
|
|
||||||
270C..2712 ; Extended_Pictographic# 1.1 [7] (✌️..✒️) victory hand..black nib
|
|
||||||
2714 ; Extended_Pictographic# 1.1 [1] (✔️) check mark
|
|
||||||
2716 ; Extended_Pictographic# 1.1 [1] (✖️) multiplication sign
|
|
||||||
271D ; Extended_Pictographic# 1.1 [1] (✝️) latin cross
|
|
||||||
2721 ; Extended_Pictographic# 1.1 [1] (✡️) star of David
|
|
||||||
2728 ; Extended_Pictographic# 6.0 [1] (✨) sparkles
|
|
||||||
2733..2734 ; Extended_Pictographic# 1.1 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star
|
|
||||||
2744 ; Extended_Pictographic# 1.1 [1] (❄️) snowflake
|
|
||||||
2747 ; Extended_Pictographic# 1.1 [1] (❇️) sparkle
|
|
||||||
274C ; Extended_Pictographic# 6.0 [1] (❌) cross mark
|
|
||||||
274E ; Extended_Pictographic# 6.0 [1] (❎) cross mark button
|
|
||||||
2753..2755 ; Extended_Pictographic# 6.0 [3] (❓..❕) question mark..white exclamation mark
|
|
||||||
2757 ; Extended_Pictographic# 5.2 [1] (❗) exclamation mark
|
|
||||||
2763..2767 ; Extended_Pictographic# 1.1 [5] (❣️..❧) heart exclamation..ROTATED FLORAL HEART BULLET
|
|
||||||
2795..2797 ; Extended_Pictographic# 6.0 [3] (➕..➗) plus sign..division sign
|
|
||||||
27A1 ; Extended_Pictographic# 1.1 [1] (➡️) right arrow
|
|
||||||
27B0 ; Extended_Pictographic# 6.0 [1] (➰) curly loop
|
|
||||||
27BF ; Extended_Pictographic# 6.0 [1] (➿) double curly loop
|
|
||||||
2934..2935 ; Extended_Pictographic# 3.2 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down
|
|
||||||
2B05..2B07 ; Extended_Pictographic# 4.0 [3] (⬅️..⬇️) left arrow..down arrow
|
|
||||||
2B1B..2B1C ; Extended_Pictographic# 5.1 [2] (⬛..⬜) black large square..white large square
|
|
||||||
2B50 ; Extended_Pictographic# 5.1 [1] (⭐) star
|
|
||||||
2B55 ; Extended_Pictographic# 5.2 [1] (⭕) hollow red circle
|
|
||||||
3030 ; Extended_Pictographic# 1.1 [1] (〰️) wavy dash
|
|
||||||
303D ; Extended_Pictographic# 3.2 [1] (〽️) part alternation mark
|
|
||||||
3297 ; Extended_Pictographic# 1.1 [1] (㊗️) Japanese “congratulations” button
|
|
||||||
3299 ; Extended_Pictographic# 1.1 [1] (㊙️) Japanese “secret” button
|
|
||||||
1F000..1F02B ; Extended_Pictographic# 5.1 [44] (🀀..🀫) MAHJONG TILE EAST WIND..MAHJONG TILE BACK
|
|
||||||
1F02C..1F02F ; Extended_Pictographic# NA [4] (..) <reserved-1F02C>..<reserved-1F02F>
|
|
||||||
1F030..1F093 ; Extended_Pictographic# 5.1[100] (🀰..🂓) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
|
|
||||||
1F094..1F09F ; Extended_Pictographic# NA [12] (..) <reserved-1F094>..<reserved-1F09F>
|
|
||||||
1F0A0..1F0AE ; Extended_Pictographic# 6.0 [15] (🂠..🂮) PLAYING CARD BACK..PLAYING CARD KING OF SPADES
|
|
||||||
1F0AF..1F0B0 ; Extended_Pictographic# NA [2] (..) <reserved-1F0AF>..<reserved-1F0B0>
|
|
||||||
1F0B1..1F0BE ; Extended_Pictographic# 6.0 [14] (🂱..🂾) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS
|
|
||||||
1F0BF ; Extended_Pictographic# 7.0 [1] (🂿) PLAYING CARD RED JOKER
|
|
||||||
1F0C0 ; Extended_Pictographic# NA [1] () <reserved-1F0C0>
|
|
||||||
1F0C1..1F0CF ; Extended_Pictographic# 6.0 [15] (🃁..🃏) PLAYING CARD ACE OF DIAMONDS..joker
|
|
||||||
1F0D0 ; Extended_Pictographic# NA [1] () <reserved-1F0D0>
|
|
||||||
1F0D1..1F0DF ; Extended_Pictographic# 6.0 [15] (🃑..🃟) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER
|
|
||||||
1F0E0..1F0F5 ; Extended_Pictographic# 7.0 [22] (🃠..🃵) PLAYING CARD FOOL..PLAYING CARD TRUMP-21
|
|
||||||
1F0F6..1F0FF ; Extended_Pictographic# NA [10] (..) <reserved-1F0F6>..<reserved-1F0FF>
|
|
||||||
1F10D..1F10F ; Extended_Pictographic# NA [3] (🄍..🄏) <reserved-1F10D>..<reserved-1F10F>
|
|
||||||
1F12F ; Extended_Pictographic# 11.0 [1] (🄯) COPYLEFT SYMBOL
|
|
||||||
1F16C ; Extended_Pictographic# 12.0 [1] (🅬) RAISED MR SIGN
|
|
||||||
1F16D..1F16F ; Extended_Pictographic# NA [3] (🅭..🅯) <reserved-1F16D>..<reserved-1F16F>
|
|
||||||
1F170..1F171 ; Extended_Pictographic# 6.0 [2] (🅰️..🅱️) A button (blood type)..B button (blood type)
|
|
||||||
1F17E ; Extended_Pictographic# 6.0 [1] (🅾️) O button (blood type)
|
|
||||||
1F17F ; Extended_Pictographic# 5.2 [1] (🅿️) P button
|
|
||||||
1F18E ; Extended_Pictographic# 6.0 [1] (🆎) AB button (blood type)
|
|
||||||
1F191..1F19A ; Extended_Pictographic# 6.0 [10] (🆑..🆚) CL button..VS button
|
|
||||||
1F1AD..1F1E5 ; Extended_Pictographic# NA [57] (🆭..) <reserved-1F1AD>..<reserved-1F1E5>
|
|
||||||
1F201..1F202 ; Extended_Pictographic# 6.0 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button
|
|
||||||
1F203..1F20F ; Extended_Pictographic# NA [13] (..) <reserved-1F203>..<reserved-1F20F>
|
|
||||||
1F21A ; Extended_Pictographic# 5.2 [1] (🈚) Japanese “free of charge” button
|
|
||||||
1F22F ; Extended_Pictographic# 5.2 [1] (🈯) Japanese “reserved” button
|
|
||||||
1F232..1F23A ; Extended_Pictographic# 6.0 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button
|
|
||||||
1F23C..1F23F ; Extended_Pictographic# NA [4] (..) <reserved-1F23C>..<reserved-1F23F>
|
|
||||||
1F249..1F24F ; Extended_Pictographic# NA [7] (..) <reserved-1F249>..<reserved-1F24F>
|
|
||||||
1F250..1F251 ; Extended_Pictographic# 6.0 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button
|
|
||||||
1F252..1F25F ; Extended_Pictographic# NA [14] (..) <reserved-1F252>..<reserved-1F25F>
|
|
||||||
1F260..1F265 ; Extended_Pictographic# 10.0 [6] (🉠..🉥) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI
|
|
||||||
1F266..1F2FF ; Extended_Pictographic# NA[154] (..) <reserved-1F266>..<reserved-1F2FF>
|
|
||||||
1F300..1F320 ; Extended_Pictographic# 6.0 [33] (🌀..🌠) cyclone..shooting star
|
|
||||||
1F321..1F32C ; Extended_Pictographic# 7.0 [12] (🌡️..🌬️) thermometer..wind face
|
|
||||||
1F32D..1F32F ; Extended_Pictographic# 8.0 [3] (🌭..🌯) hot dog..burrito
|
|
||||||
1F330..1F335 ; Extended_Pictographic# 6.0 [6] (🌰..🌵) chestnut..cactus
|
|
||||||
1F336 ; Extended_Pictographic# 7.0 [1] (🌶️) hot pepper
|
|
||||||
1F337..1F37C ; Extended_Pictographic# 6.0 [70] (🌷..🍼) tulip..baby bottle
|
|
||||||
1F37D ; Extended_Pictographic# 7.0 [1] (🍽️) fork and knife with plate
|
|
||||||
1F37E..1F37F ; Extended_Pictographic# 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn
|
|
||||||
1F380..1F393 ; Extended_Pictographic# 6.0 [20] (🎀..🎓) ribbon..graduation cap
|
|
||||||
1F394..1F39F ; Extended_Pictographic# 7.0 [12] (🎔..🎟️) HEART WITH TIP ON THE LEFT..admission tickets
|
|
||||||
1F3A0..1F3C4 ; Extended_Pictographic# 6.0 [37] (🎠..🏄) carousel horse..person surfing
|
|
||||||
1F3C5 ; Extended_Pictographic# 7.0 [1] (🏅) sports medal
|
|
||||||
1F3C6..1F3CA ; Extended_Pictographic# 6.0 [5] (🏆..🏊) trophy..person swimming
|
|
||||||
1F3CB..1F3CE ; Extended_Pictographic# 7.0 [4] (🏋️..🏎️) person lifting weights..racing car
|
|
||||||
1F3CF..1F3D3 ; Extended_Pictographic# 8.0 [5] (🏏..🏓) cricket game..ping pong
|
|
||||||
1F3D4..1F3DF ; Extended_Pictographic# 7.0 [12] (🏔️..🏟️) snow-capped mountain..stadium
|
|
||||||
1F3E0..1F3F0 ; Extended_Pictographic# 6.0 [17] (🏠..🏰) house..castle
|
|
||||||
1F3F1..1F3F7 ; Extended_Pictographic# 7.0 [7] (🏱..🏷️) WHITE PENNANT..label
|
|
||||||
1F3F8..1F3FA ; Extended_Pictographic# 8.0 [3] (🏸..🏺) badminton..amphora
|
|
||||||
1F400..1F43E ; Extended_Pictographic# 6.0 [63] (🐀..🐾) rat..paw prints
|
|
||||||
1F43F ; Extended_Pictographic# 7.0 [1] (🐿️) chipmunk
|
|
||||||
1F440 ; Extended_Pictographic# 6.0 [1] (👀) eyes
|
|
||||||
1F441 ; Extended_Pictographic# 7.0 [1] (👁️) eye
|
|
||||||
1F442..1F4F7 ; Extended_Pictographic# 6.0[182] (👂..📷) ear..camera
|
|
||||||
1F4F8 ; Extended_Pictographic# 7.0 [1] (📸) camera with flash
|
|
||||||
1F4F9..1F4FC ; Extended_Pictographic# 6.0 [4] (📹..📼) video camera..videocassette
|
|
||||||
1F4FD..1F4FE ; Extended_Pictographic# 7.0 [2] (📽️..📾) film projector..PORTABLE STEREO
|
|
||||||
1F4FF ; Extended_Pictographic# 8.0 [1] (📿) prayer beads
|
|
||||||
1F500..1F53D ; Extended_Pictographic# 6.0 [62] (🔀..🔽) shuffle tracks button..downwards button
|
|
||||||
1F546..1F54A ; Extended_Pictographic# 7.0 [5] (🕆..🕊️) WHITE LATIN CROSS..dove
|
|
||||||
1F54B..1F54F ; Extended_Pictographic# 8.0 [5] (🕋..🕏) kaaba..BOWL OF HYGIEIA
|
|
||||||
1F550..1F567 ; Extended_Pictographic# 6.0 [24] (🕐..🕧) one o’clock..twelve-thirty
|
|
||||||
1F568..1F579 ; Extended_Pictographic# 7.0 [18] (🕨..🕹️) RIGHT SPEAKER..joystick
|
|
||||||
1F57A ; Extended_Pictographic# 9.0 [1] (🕺) man dancing
|
|
||||||
1F57B..1F5A3 ; Extended_Pictographic# 7.0 [41] (🕻..🖣) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX
|
|
||||||
1F5A4 ; Extended_Pictographic# 9.0 [1] (🖤) black heart
|
|
||||||
1F5A5..1F5FA ; Extended_Pictographic# 7.0 [86] (🖥️..🗺️) desktop computer..world map
|
|
||||||
1F5FB..1F5FF ; Extended_Pictographic# 6.0 [5] (🗻..🗿) mount fuji..moai
|
|
||||||
1F600 ; Extended_Pictographic# 6.1 [1] (😀) grinning face
|
|
||||||
1F601..1F610 ; Extended_Pictographic# 6.0 [16] (😁..😐) beaming face with smiling eyes..neutral face
|
|
||||||
1F611 ; Extended_Pictographic# 6.1 [1] (😑) expressionless face
|
|
||||||
1F612..1F614 ; Extended_Pictographic# 6.0 [3] (😒..😔) unamused face..pensive face
|
|
||||||
1F615 ; Extended_Pictographic# 6.1 [1] (😕) confused face
|
|
||||||
1F616 ; Extended_Pictographic# 6.0 [1] (😖) confounded face
|
|
||||||
1F617 ; Extended_Pictographic# 6.1 [1] (😗) kissing face
|
|
||||||
1F618 ; Extended_Pictographic# 6.0 [1] (😘) face blowing a kiss
|
|
||||||
1F619 ; Extended_Pictographic# 6.1 [1] (😙) kissing face with smiling eyes
|
|
||||||
1F61A ; Extended_Pictographic# 6.0 [1] (😚) kissing face with closed eyes
|
|
||||||
1F61B ; Extended_Pictographic# 6.1 [1] (😛) face with tongue
|
|
||||||
1F61C..1F61E ; Extended_Pictographic# 6.0 [3] (😜..😞) winking face with tongue..disappointed face
|
|
||||||
1F61F ; Extended_Pictographic# 6.1 [1] (😟) worried face
|
|
||||||
1F620..1F625 ; Extended_Pictographic# 6.0 [6] (😠..😥) angry face..sad but relieved face
|
|
||||||
1F626..1F627 ; Extended_Pictographic# 6.1 [2] (😦..😧) frowning face with open mouth..anguished face
|
|
||||||
1F628..1F62B ; Extended_Pictographic# 6.0 [4] (😨..😫) fearful face..tired face
|
|
||||||
1F62C ; Extended_Pictographic# 6.1 [1] (😬) grimacing face
|
|
||||||
1F62D ; Extended_Pictographic# 6.0 [1] (😭) loudly crying face
|
|
||||||
1F62E..1F62F ; Extended_Pictographic# 6.1 [2] (😮..😯) face with open mouth..hushed face
|
|
||||||
1F630..1F633 ; Extended_Pictographic# 6.0 [4] (😰..😳) anxious face with sweat..flushed face
|
|
||||||
1F634 ; Extended_Pictographic# 6.1 [1] (😴) sleeping face
|
|
||||||
1F635..1F640 ; Extended_Pictographic# 6.0 [12] (😵..🙀) dizzy face..weary cat
|
|
||||||
1F641..1F642 ; Extended_Pictographic# 7.0 [2] (🙁..🙂) slightly frowning face..slightly smiling face
|
|
||||||
1F643..1F644 ; Extended_Pictographic# 8.0 [2] (🙃..🙄) upside-down face..face with rolling eyes
|
|
||||||
1F645..1F64F ; Extended_Pictographic# 6.0 [11] (🙅..🙏) person gesturing NO..folded hands
|
|
||||||
1F680..1F6C5 ; Extended_Pictographic# 6.0 [70] (🚀..🛅) rocket..left luggage
|
|
||||||
1F6C6..1F6CF ; Extended_Pictographic# 7.0 [10] (🛆..🛏️) TRIANGLE WITH ROUNDED CORNERS..bed
|
|
||||||
1F6D0 ; Extended_Pictographic# 8.0 [1] (🛐) place of worship
|
|
||||||
1F6D1..1F6D2 ; Extended_Pictographic# 9.0 [2] (🛑..🛒) stop sign..shopping cart
|
|
||||||
1F6D3..1F6D4 ; Extended_Pictographic# 10.0 [2] (🛓..🛔) STUPA..PAGODA
|
|
||||||
1F6D5 ; Extended_Pictographic# 12.0 [1] (🛕) hindu temple
|
|
||||||
1F6D6..1F6DF ; Extended_Pictographic# NA [10] (🛖..🛟) <reserved-1F6D6>..<reserved-1F6DF>
|
|
||||||
1F6E0..1F6EC ; Extended_Pictographic# 7.0 [13] (🛠️..🛬) hammer and wrench..airplane arrival
|
|
||||||
1F6ED..1F6EF ; Extended_Pictographic# NA [3] (..) <reserved-1F6ED>..<reserved-1F6EF>
|
|
||||||
1F6F0..1F6F3 ; Extended_Pictographic# 7.0 [4] (🛰️..🛳️) satellite..passenger ship
|
|
||||||
1F6F4..1F6F6 ; Extended_Pictographic# 9.0 [3] (🛴..🛶) kick scooter..canoe
|
|
||||||
1F6F7..1F6F8 ; Extended_Pictographic# 10.0 [2] (🛷..🛸) sled..flying saucer
|
|
||||||
1F6F9 ; Extended_Pictographic# 11.0 [1] (🛹) skateboard
|
|
||||||
1F6FA ; Extended_Pictographic# 12.0 [1] (🛺) auto rickshaw
|
|
||||||
1F6FB..1F6FF ; Extended_Pictographic# NA [5] (🛻..) <reserved-1F6FB>..<reserved-1F6FF>
|
|
||||||
1F774..1F77F ; Extended_Pictographic# NA [12] (🝴..🝿) <reserved-1F774>..<reserved-1F77F>
|
|
||||||
1F7D5..1F7D8 ; Extended_Pictographic# 11.0 [4] (🟕..🟘) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE
|
|
||||||
1F7D9..1F7DF ; Extended_Pictographic# NA [7] (🟙..) <reserved-1F7D9>..<reserved-1F7DF>
|
|
||||||
1F7E0..1F7EB ; Extended_Pictographic# 12.0 [12] (🟠..🟫) orange circle..brown square
|
|
||||||
1F7EC..1F7FF ; Extended_Pictographic# NA [20] (..) <reserved-1F7EC>..<reserved-1F7FF>
|
|
||||||
1F80C..1F80F ; Extended_Pictographic# NA [4] (..) <reserved-1F80C>..<reserved-1F80F>
|
|
||||||
1F848..1F84F ; Extended_Pictographic# NA [8] (..) <reserved-1F848>..<reserved-1F84F>
|
|
||||||
1F85A..1F85F ; Extended_Pictographic# NA [6] (..) <reserved-1F85A>..<reserved-1F85F>
|
|
||||||
1F888..1F88F ; Extended_Pictographic# NA [8] (..) <reserved-1F888>..<reserved-1F88F>
|
|
||||||
1F8AE..1F8FF ; Extended_Pictographic# NA [82] (..) <reserved-1F8AE>..<reserved-1F8FF>
|
|
||||||
1F90C ; Extended_Pictographic# NA [1] (🤌) <reserved-1F90C>
|
|
||||||
1F90D..1F90F ; Extended_Pictographic# 12.0 [3] (🤍..🤏) white heart..pinching hand
|
|
||||||
1F910..1F918 ; Extended_Pictographic# 8.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns
|
|
||||||
1F919..1F91E ; Extended_Pictographic# 9.0 [6] (🤙..🤞) call me hand..crossed fingers
|
|
||||||
1F91F ; Extended_Pictographic# 10.0 [1] (🤟) love-you gesture
|
|
||||||
1F920..1F927 ; Extended_Pictographic# 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face
|
|
||||||
1F928..1F92F ; Extended_Pictographic# 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head
|
|
||||||
1F930 ; Extended_Pictographic# 9.0 [1] (🤰) pregnant woman
|
|
||||||
1F931..1F932 ; Extended_Pictographic# 10.0 [2] (🤱..🤲) breast-feeding..palms up together
|
|
||||||
1F933..1F93A ; Extended_Pictographic# 9.0 [8] (🤳..🤺) selfie..person fencing
|
|
||||||
1F93C..1F93E ; Extended_Pictographic# 9.0 [3] (🤼..🤾) people wrestling..person playing handball
|
|
||||||
1F93F ; Extended_Pictographic# 12.0 [1] (🤿) diving mask
|
|
||||||
1F940..1F945 ; Extended_Pictographic# 9.0 [6] (🥀..🥅) wilted flower..goal net
|
|
||||||
1F947..1F94B ; Extended_Pictographic# 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform
|
|
||||||
1F94C ; Extended_Pictographic# 10.0 [1] (🥌) curling stone
|
|
||||||
1F94D..1F94F ; Extended_Pictographic# 11.0 [3] (🥍..🥏) lacrosse..flying disc
|
|
||||||
1F950..1F95E ; Extended_Pictographic# 9.0 [15] (🥐..🥞) croissant..pancakes
|
|
||||||
1F95F..1F96B ; Extended_Pictographic# 10.0 [13] (🥟..🥫) dumpling..canned food
|
|
||||||
1F96C..1F970 ; Extended_Pictographic# 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts
|
|
||||||
1F971 ; Extended_Pictographic# 12.0 [1] (🥱) yawning face
|
|
||||||
1F972 ; Extended_Pictographic# NA [1] (🥲) <reserved-1F972>
|
|
||||||
1F973..1F976 ; Extended_Pictographic# 11.0 [4] (🥳..🥶) partying face..cold face
|
|
||||||
1F977..1F979 ; Extended_Pictographic# NA [3] (🥷..🥹) <reserved-1F977>..<reserved-1F979>
|
|
||||||
1F97A ; Extended_Pictographic# 11.0 [1] (🥺) pleading face
|
|
||||||
1F97B ; Extended_Pictographic# 12.0 [1] (🥻) sari
|
|
||||||
1F97C..1F97F ; Extended_Pictographic# 11.0 [4] (🥼..🥿) lab coat..flat shoe
|
|
||||||
1F980..1F984 ; Extended_Pictographic# 8.0 [5] (🦀..🦄) crab..unicorn
|
|
||||||
1F985..1F991 ; Extended_Pictographic# 9.0 [13] (🦅..🦑) eagle..squid
|
|
||||||
1F992..1F997 ; Extended_Pictographic# 10.0 [6] (🦒..🦗) giraffe..cricket
|
|
||||||
1F998..1F9A2 ; Extended_Pictographic# 11.0 [11] (🦘..🦢) kangaroo..swan
|
|
||||||
1F9A3..1F9A4 ; Extended_Pictographic# NA [2] (🦣..🦤) <reserved-1F9A3>..<reserved-1F9A4>
|
|
||||||
1F9A5..1F9AA ; Extended_Pictographic# 12.0 [6] (🦥..🦪) sloth..oyster
|
|
||||||
1F9AB..1F9AD ; Extended_Pictographic# NA [3] (🦫..🦭) <reserved-1F9AB>..<reserved-1F9AD>
|
|
||||||
1F9AE..1F9AF ; Extended_Pictographic# 12.0 [2] (🦮..🦯) guide dog..probing cane
|
|
||||||
1F9B0..1F9B9 ; Extended_Pictographic# 11.0 [10] (🦰..🦹) red hair..supervillain
|
|
||||||
1F9BA..1F9BF ; Extended_Pictographic# 12.0 [6] (🦺..🦿) safety vest..mechanical leg
|
|
||||||
1F9C0 ; Extended_Pictographic# 8.0 [1] (🧀) cheese wedge
|
|
||||||
1F9C1..1F9C2 ; Extended_Pictographic# 11.0 [2] (🧁..🧂) cupcake..salt
|
|
||||||
1F9C3..1F9CA ; Extended_Pictographic# 12.0 [8] (🧃..🧊) beverage box..ice cube
|
|
||||||
1F9CB..1F9CC ; Extended_Pictographic# NA [2] (🧋..🧌) <reserved-1F9CB>..<reserved-1F9CC>
|
|
||||||
1F9CD..1F9CF ; Extended_Pictographic# 12.0 [3] (🧍..🧏) person standing..deaf person
|
|
||||||
1F9D0..1F9E6 ; Extended_Pictographic# 10.0 [23] (🧐..🧦) face with monocle..socks
|
|
||||||
1F9E7..1F9FF ; Extended_Pictographic# 11.0 [25] (🧧..🧿) red envelope..nazar amulet
|
|
||||||
1FA00..1FA53 ; Extended_Pictographic# 12.0 [84] (🨀..🩓) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP
|
|
||||||
1FA54..1FA5F ; Extended_Pictographic# NA [12] (..) <reserved-1FA54>..<reserved-1FA5F>
|
|
||||||
1FA60..1FA6D ; Extended_Pictographic# 11.0 [14] (🩠..🩭) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
|
|
||||||
1FA6E..1FA6F ; Extended_Pictographic# NA [2] (..) <reserved-1FA6E>..<reserved-1FA6F>
|
|
||||||
1FA70..1FA73 ; Extended_Pictographic# 12.0 [4] (🩰..🩳) ballet shoes..shorts
|
|
||||||
1FA74..1FA77 ; Extended_Pictographic# NA [4] (🩴..🩷) <reserved-1FA74>..<reserved-1FA77>
|
|
||||||
1FA78..1FA7A ; Extended_Pictographic# 12.0 [3] (🩸..🩺) drop of blood..stethoscope
|
|
||||||
1FA7B..1FA7F ; Extended_Pictographic# NA [5] (🩻..) <reserved-1FA7B>..<reserved-1FA7F>
|
|
||||||
1FA80..1FA82 ; Extended_Pictographic# 12.0 [3] (🪀..🪂) yo-yo..parachute
|
|
||||||
1FA83..1FA8F ; Extended_Pictographic# NA [13] (🪃..) <reserved-1FA83>..<reserved-1FA8F>
|
|
||||||
1FA90..1FA95 ; Extended_Pictographic# 12.0 [6] (🪐..🪕) ringed planet..banjo
|
|
||||||
1FA96..1FFFD ; Extended_Pictographic# NA[1384] (🪖..) <reserved-1FA96>..<reserved-1FFFD>
|
|
||||||
|
|
||||||
# Total elements: 3793
|
|
||||||
|
|
||||||
#EOF
|
|
4879
lib/pleroma/emoji-test.txt
Normal file
4879
lib/pleroma/emoji-test.txt
Normal file
File diff suppressed because it is too large
Load diff
|
@ -102,31 +102,36 @@ defp update_emojis(emojis) do
|
||||||
:ets.insert(@ets, emojis)
|
:ets.insert(@ets, emojis)
|
||||||
end
|
end
|
||||||
|
|
||||||
@external_resource "lib/pleroma/emoji-data.txt"
|
@external_resource "lib/pleroma/emoji-test.txt"
|
||||||
|
|
||||||
|
regional_indicators =
|
||||||
|
Enum.map(127_462..127_487, fn codepoint ->
|
||||||
|
<<codepoint::utf8>>
|
||||||
|
end)
|
||||||
|
|
||||||
emojis =
|
emojis =
|
||||||
@external_resource
|
@external_resource
|
||||||
|> File.read!()
|
|> File.read!()
|
||||||
|> String.split("\n")
|
|> String.split("\n")
|
||||||
|> Enum.filter(fn line -> line != "" and not String.starts_with?(line, "#") end)
|
|> Enum.filter(fn line ->
|
||||||
|
line != "" and not String.starts_with?(line, "#") and
|
||||||
|
String.contains?(line, "fully-qualified")
|
||||||
|
end)
|
||||||
|> Enum.map(fn line ->
|
|> Enum.map(fn line ->
|
||||||
line
|
line
|
||||||
|> String.split(";", parts: 2)
|
|> String.split(";", parts: 2)
|
||||||
|> hd()
|
|> hd()
|
||||||
|> String.trim()
|
|> String.trim()
|
||||||
|> String.split("..")
|
|> String.split()
|
||||||
|> case do
|
|> Enum.map(fn codepoint ->
|
||||||
[number] ->
|
<<String.to_integer(codepoint, 16)::utf8>>
|
||||||
<<String.to_integer(number, 16)::utf8>>
|
end)
|
||||||
|
|> Enum.join()
|
||||||
[first, last] ->
|
|
||||||
String.to_integer(first, 16)..String.to_integer(last, 16)
|
|
||||||
|> Enum.map(&<<&1::utf8>>)
|
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|> List.flatten()
|
|
||||||
|> Enum.uniq()
|
|> Enum.uniq()
|
||||||
|
|
||||||
|
emojis = emojis ++ regional_indicators
|
||||||
|
|
||||||
for emoji <- emojis do
|
for emoji <- emojis do
|
||||||
def is_unicode_emoji?(unquote(emoji)), do: true
|
def is_unicode_emoji?(unquote(emoji)), do: true
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,6 +12,26 @@ defmodule Pleroma.ModerationLog do
|
||||||
|
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
|
@type t :: %__MODULE__{}
|
||||||
|
@type log_subject :: Activity.t() | User.t() | list(User.t())
|
||||||
|
@type log_params :: %{
|
||||||
|
required(:actor) => User.t(),
|
||||||
|
required(:action) => String.t(),
|
||||||
|
optional(:subject) => log_subject(),
|
||||||
|
optional(:subject_actor) => User.t(),
|
||||||
|
optional(:subject_id) => String.t(),
|
||||||
|
optional(:subjects) => list(User.t()),
|
||||||
|
optional(:permission) => String.t(),
|
||||||
|
optional(:text) => String.t(),
|
||||||
|
optional(:sensitive) => String.t(),
|
||||||
|
optional(:visibility) => String.t(),
|
||||||
|
optional(:followed) => User.t(),
|
||||||
|
optional(:follower) => User.t(),
|
||||||
|
optional(:nicknames) => list(String.t()),
|
||||||
|
optional(:tags) => list(String.t()),
|
||||||
|
optional(:target) => String.t()
|
||||||
|
}
|
||||||
|
|
||||||
schema "moderation_log" do
|
schema "moderation_log" do
|
||||||
field(:data, :map)
|
field(:data, :map)
|
||||||
|
|
||||||
|
@ -90,203 +110,105 @@ defp parse_datetime(datetime) do
|
||||||
parsed_datetime
|
parsed_datetime
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subject: [User], action: String.t(), permission: String.t()}) ::
|
defp prepare_log_data(%{actor: actor, action: action} = attrs) do
|
||||||
{:ok, ModerationLog} | {:error, any}
|
%{
|
||||||
def insert_log(%{
|
|
||||||
actor: %User{} = actor,
|
|
||||||
subject: subjects,
|
|
||||||
action: action,
|
|
||||||
permission: permission
|
|
||||||
}) do
|
|
||||||
%ModerationLog{
|
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
"actor" => user_to_map(actor),
|
||||||
"subject" => user_to_map(subjects),
|
|
||||||
"action" => action,
|
"action" => action,
|
||||||
"permission" => permission,
|
|
||||||
"message" => ""
|
"message" => ""
|
||||||
}
|
}
|
||||||
}
|
|> Pleroma.Maps.put_if_present("subject_actor", user_to_map(attrs[:subject_actor]))
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subject: User, action: String.t()}) ::
|
defp prepare_log_data(attrs), do: attrs
|
||||||
{:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{
|
@spec insert_log(log_params()) :: {:ok, ModerationLog} | {:error, any}
|
||||||
actor: %User{} = actor,
|
def insert_log(%{actor: %User{}, subject: subjects, permission: permission} = attrs) do
|
||||||
action: "report_update",
|
data =
|
||||||
subject: %Activity{data: %{"type" => "Flag"}} = subject
|
attrs
|
||||||
}) do
|
|> prepare_log_data
|
||||||
%ModerationLog{
|
|> Map.merge(%{"subject" => user_to_map(subjects), "permission" => permission})
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
"action" => "report_update",
|
|
||||||
"subject" => report_to_map(subject),
|
|
||||||
"message" => ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subject: Activity, action: String.t(), text: String.t()}) ::
|
def insert_log(%{actor: %User{}, action: action, subject: %Activity{} = subject} = attrs)
|
||||||
{:ok, ModerationLog} | {:error, any}
|
when action in ["report_note_delete", "report_update", "report_note"] do
|
||||||
def insert_log(%{
|
data =
|
||||||
actor: %User{} = actor,
|
attrs
|
||||||
action: "report_note",
|
|> prepare_log_data
|
||||||
subject: %Activity{} = subject,
|
|> Pleroma.Maps.put_if_present("text", attrs[:text])
|
||||||
text: text
|
|> Map.merge(%{"subject" => report_to_map(subject)})
|
||||||
}) do
|
|
||||||
%ModerationLog{
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => "report_note",
|
|
||||||
"subject" => report_to_map(subject),
|
|
||||||
"text" => text
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subject: Activity, action: String.t(), text: String.t()}) ::
|
def insert_log(
|
||||||
{:ok, ModerationLog} | {:error, any}
|
%{
|
||||||
def insert_log(%{
|
actor: %User{},
|
||||||
actor: %User{} = actor,
|
action: action,
|
||||||
action: "report_note_delete",
|
|
||||||
subject: %Activity{} = subject,
|
|
||||||
text: text
|
|
||||||
}) do
|
|
||||||
%ModerationLog{
|
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => "report_note_delete",
|
|
||||||
"subject" => report_to_map(subject),
|
|
||||||
"text" => text
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec insert_log(%{
|
|
||||||
actor: User,
|
|
||||||
subject: Activity,
|
|
||||||
action: String.t(),
|
|
||||||
sensitive: String.t(),
|
|
||||||
visibility: String.t()
|
|
||||||
}) :: {:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{
|
|
||||||
actor: %User{} = actor,
|
|
||||||
action: "status_update",
|
|
||||||
subject: %Activity{} = subject,
|
subject: %Activity{} = subject,
|
||||||
sensitive: sensitive,
|
sensitive: sensitive,
|
||||||
visibility: visibility
|
visibility: visibility
|
||||||
}) do
|
} = attrs
|
||||||
%ModerationLog{
|
)
|
||||||
data: %{
|
when action == "status_update" do
|
||||||
"actor" => user_to_map(actor),
|
data =
|
||||||
"action" => "status_update",
|
attrs
|
||||||
|
|> prepare_log_data
|
||||||
|
|> Map.merge(%{
|
||||||
"subject" => status_to_map(subject),
|
"subject" => status_to_map(subject),
|
||||||
"sensitive" => sensitive,
|
"sensitive" => sensitive,
|
||||||
"visibility" => visibility,
|
"visibility" => visibility
|
||||||
"message" => ""
|
})
|
||||||
}
|
|
||||||
}
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, action: String.t(), subject_id: String.t()}) ::
|
def insert_log(%{actor: %User{}, action: action, subject_id: subject_id} = attrs)
|
||||||
{:ok, ModerationLog} | {:error, any}
|
when action == "status_delete" do
|
||||||
def insert_log(%{
|
data =
|
||||||
actor: %User{} = actor,
|
attrs
|
||||||
action: "status_delete",
|
|> prepare_log_data
|
||||||
subject_id: subject_id
|
|> Map.merge(%{"subject_id" => subject_id})
|
||||||
}) do
|
|
||||||
%ModerationLog{
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => "status_delete",
|
|
||||||
"subject_id" => subject_id,
|
|
||||||
"message" => ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subject: User, action: String.t()}) ::
|
def insert_log(%{actor: %User{}, subject: subject, action: _action} = attrs) do
|
||||||
{:ok, ModerationLog} | {:error, any}
|
data =
|
||||||
def insert_log(%{actor: %User{} = actor, subject: subject, action: action}) do
|
attrs
|
||||||
%ModerationLog{
|
|> prepare_log_data
|
||||||
data: %{
|
|> Map.merge(%{"subject" => user_to_map(subject)})
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => action,
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
"subject" => user_to_map(subject),
|
|
||||||
"message" => ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, subjects: [User], action: String.t()}) ::
|
def insert_log(%{actor: %User{}, subjects: subjects, action: _action} = attrs) do
|
||||||
{:ok, ModerationLog} | {:error, any}
|
data =
|
||||||
def insert_log(%{actor: %User{} = actor, subjects: subjects, action: action}) do
|
attrs
|
||||||
subjects = Enum.map(subjects, &user_to_map/1)
|
|> prepare_log_data
|
||||||
|
|> Map.merge(%{"subjects" => user_to_map(subjects)})
|
||||||
|
|
||||||
%ModerationLog{
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => action,
|
|
||||||
"subjects" => subjects,
|
|
||||||
"message" => ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, action: String.t(), followed: User, follower: User}) ::
|
def insert_log(
|
||||||
{:ok, ModerationLog} | {:error, any}
|
%{
|
||||||
def insert_log(%{
|
actor: %User{},
|
||||||
actor: %User{} = actor,
|
|
||||||
followed: %User{} = followed,
|
followed: %User{} = followed,
|
||||||
follower: %User{} = follower,
|
follower: %User{} = follower,
|
||||||
action: "follow"
|
action: action
|
||||||
}) do
|
} = attrs
|
||||||
%ModerationLog{
|
)
|
||||||
data: %{
|
when action in ["unfollow", "follow"] do
|
||||||
"actor" => user_to_map(actor),
|
data =
|
||||||
"action" => "follow",
|
attrs
|
||||||
"followed" => user_to_map(followed),
|
|> prepare_log_data
|
||||||
"follower" => user_to_map(follower),
|
|> Map.merge(%{"followed" => user_to_map(followed), "follower" => user_to_map(follower)})
|
||||||
"message" => ""
|
|
||||||
}
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, action: String.t(), followed: User, follower: User}) ::
|
|
||||||
{:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{
|
|
||||||
actor: %User{} = actor,
|
|
||||||
followed: %User{} = followed,
|
|
||||||
follower: %User{} = follower,
|
|
||||||
action: "unfollow"
|
|
||||||
}) do
|
|
||||||
%ModerationLog{
|
|
||||||
data: %{
|
|
||||||
"actor" => user_to_map(actor),
|
|
||||||
"action" => "unfollow",
|
|
||||||
"followed" => user_to_map(followed),
|
|
||||||
"follower" => user_to_map(follower),
|
|
||||||
"message" => ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec insert_log(%{
|
|
||||||
actor: User,
|
|
||||||
action: String.t(),
|
|
||||||
nicknames: [String.t()],
|
|
||||||
tags: [String.t()]
|
|
||||||
}) :: {:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{
|
def insert_log(%{
|
||||||
actor: %User{} = actor,
|
actor: %User{} = actor,
|
||||||
nicknames: nicknames,
|
nicknames: nicknames,
|
||||||
|
@ -305,27 +227,16 @@ def insert_log(%{
|
||||||
|> insert_log_entry_with_message()
|
|> insert_log_entry_with_message()
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, action: String.t(), target: String.t()}) ::
|
def insert_log(%{actor: %User{}, action: action, target: target} = attrs)
|
||||||
{:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{
|
|
||||||
actor: %User{} = actor,
|
|
||||||
action: action,
|
|
||||||
target: target
|
|
||||||
})
|
|
||||||
when action in ["relay_follow", "relay_unfollow"] do
|
when action in ["relay_follow", "relay_unfollow"] do
|
||||||
%ModerationLog{
|
data =
|
||||||
data: %{
|
attrs
|
||||||
"actor" => user_to_map(actor),
|
|> prepare_log_data
|
||||||
"action" => action,
|
|> Map.merge(%{"target" => target})
|
||||||
"target" => target,
|
|
||||||
"message" => ""
|
insert_log_entry_with_message(%ModerationLog{data: data})
|
||||||
}
|
|
||||||
}
|
|
||||||
|> insert_log_entry_with_message()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec insert_log(%{actor: User, action: String.t(), subject_id: String.t()}) ::
|
|
||||||
{:ok, ModerationLog} | {:error, any}
|
|
||||||
def insert_log(%{actor: %User{} = actor, action: "chat_message_delete", subject_id: subject_id}) do
|
def insert_log(%{actor: %User{} = actor, action: "chat_message_delete", subject_id: subject_id}) do
|
||||||
%ModerationLog{
|
%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
|
@ -345,32 +256,27 @@ defp insert_log_entry_with_message(entry) do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp user_to_map(users) when is_list(users) do
|
defp user_to_map(users) when is_list(users) do
|
||||||
users |> Enum.map(&user_to_map/1)
|
Enum.map(users, &user_to_map/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp user_to_map(%User{} = user) do
|
defp user_to_map(%User{} = user) do
|
||||||
user
|
user
|
||||||
|> Map.from_struct()
|
|
||||||
|> Map.take([:id, :nickname])
|
|> Map.take([:id, :nickname])
|
||||||
|> Map.new(fn {k, v} -> {Atom.to_string(k), v} end)
|
|> Map.new(fn {k, v} -> {Atom.to_string(k), v} end)
|
||||||
|> Map.put("type", "user")
|
|> Map.put("type", "user")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp user_to_map(_), do: nil
|
||||||
|
|
||||||
defp report_to_map(%Activity{} = report) do
|
defp report_to_map(%Activity{} = report) do
|
||||||
%{
|
%{"type" => "report", "id" => report.id, "state" => report.data["state"]}
|
||||||
"type" => "report",
|
|
||||||
"id" => report.id,
|
|
||||||
"state" => report.data["state"]
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp status_to_map(%Activity{} = status) do
|
defp status_to_map(%Activity{} = status) do
|
||||||
%{
|
%{"type" => "status", "id" => status.id}
|
||||||
"type" => "status",
|
|
||||||
"id" => status.id
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@spec get_log_entry_message(ModerationLog.t()) :: String.t()
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -382,7 +288,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} made @#{follower_nickname} #{action} @#{followed_nickname}"
|
"@#{actor_nickname} made @#{follower_nickname} #{action} @#{followed_nickname}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -393,7 +298,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} deleted users: #{users_to_nicknames_string(subjects)}"
|
"@#{actor_nickname} deleted users: #{users_to_nicknames_string(subjects)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -404,7 +308,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} created users: #{users_to_nicknames_string(subjects)}"
|
"@#{actor_nickname} created users: #{users_to_nicknames_string(subjects)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -415,7 +318,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} activated users: #{users_to_nicknames_string(users)}"
|
"@#{actor_nickname} activated users: #{users_to_nicknames_string(users)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -426,7 +328,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} deactivated users: #{users_to_nicknames_string(users)}"
|
"@#{actor_nickname} deactivated users: #{users_to_nicknames_string(users)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -437,7 +338,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} approved users: #{users_to_nicknames_string(users)}"
|
"@#{actor_nickname} approved users: #{users_to_nicknames_string(users)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -451,7 +351,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} added tags: #{tags_string} to users: #{nicknames_to_string(nicknames)}"
|
"@#{actor_nickname} added tags: #{tags_string} to users: #{nicknames_to_string(nicknames)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -465,7 +364,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} removed tags: #{tags_string} from users: #{nicknames_to_string(nicknames)}"
|
"@#{actor_nickname} removed tags: #{tags_string} from users: #{nicknames_to_string(nicknames)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -477,7 +375,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} made #{users_to_nicknames_string(users)} #{permission}"
|
"@#{actor_nickname} made #{users_to_nicknames_string(users)} #{permission}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -489,7 +386,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} revoked #{permission} role from #{users_to_nicknames_string(users)}"
|
"@#{actor_nickname} revoked #{permission} role from #{users_to_nicknames_string(users)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -500,7 +396,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} followed relay: #{target}"
|
"@#{actor_nickname} followed relay: #{target}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -511,42 +406,48 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} unfollowed relay: #{target}"
|
"@#{actor_nickname} unfollowed relay: #{target}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
def get_log_entry_message(
|
||||||
def get_log_entry_message(%ModerationLog{
|
%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
"action" => "report_update",
|
"action" => "report_update",
|
||||||
"subject" => %{"id" => subject_id, "state" => state, "type" => "report"}
|
"subject" => %{"id" => subject_id, "state" => state, "type" => "report"}
|
||||||
}
|
}
|
||||||
}) do
|
} = log
|
||||||
"@#{actor_nickname} updated report ##{subject_id} with '#{state}' state"
|
) do
|
||||||
|
"@#{actor_nickname} updated report ##{subject_id}" <>
|
||||||
|
subject_actor_nickname(log, " (on user ", ")") <>
|
||||||
|
" with '#{state}' state"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
def get_log_entry_message(
|
||||||
def get_log_entry_message(%ModerationLog{
|
%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
"action" => "report_note",
|
"action" => "report_note",
|
||||||
"subject" => %{"id" => subject_id, "type" => "report"},
|
"subject" => %{"id" => subject_id, "type" => "report"},
|
||||||
"text" => text
|
"text" => text
|
||||||
}
|
}
|
||||||
}) do
|
} = log
|
||||||
"@#{actor_nickname} added note '#{text}' to report ##{subject_id}"
|
) do
|
||||||
|
"@#{actor_nickname} added note '#{text}' to report ##{subject_id}" <>
|
||||||
|
subject_actor_nickname(log, " on user ")
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
def get_log_entry_message(
|
||||||
def get_log_entry_message(%ModerationLog{
|
%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
"action" => "report_note_delete",
|
"action" => "report_note_delete",
|
||||||
"subject" => %{"id" => subject_id, "type" => "report"},
|
"subject" => %{"id" => subject_id, "type" => "report"},
|
||||||
"text" => text
|
"text" => text
|
||||||
}
|
}
|
||||||
}) do
|
} = log
|
||||||
"@#{actor_nickname} deleted note '#{text}' from report ##{subject_id}"
|
) do
|
||||||
|
"@#{actor_nickname} deleted note '#{text}' from report ##{subject_id}" <>
|
||||||
|
subject_actor_nickname(log, " on user ")
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -559,7 +460,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} updated status ##{subject_id}, set visibility: '#{visibility}'"
|
"@#{actor_nickname} updated status ##{subject_id}, set visibility: '#{visibility}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -572,7 +472,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} updated status ##{subject_id}, set sensitive: '#{sensitive}'"
|
"@#{actor_nickname} updated status ##{subject_id}, set sensitive: '#{sensitive}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -587,7 +486,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
}'"
|
}'"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -598,7 +496,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} deleted status ##{subject_id}"
|
"@#{actor_nickname} deleted status ##{subject_id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -609,7 +506,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} forced password reset for users: #{users_to_nicknames_string(subjects)}"
|
"@#{actor_nickname} forced password reset for users: #{users_to_nicknames_string(subjects)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -620,7 +516,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} confirmed email for users: #{users_to_nicknames_string(subjects)}"
|
"@#{actor_nickname} confirmed email for users: #{users_to_nicknames_string(subjects)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -633,7 +528,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
}"
|
}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -644,7 +538,6 @@ def get_log_entry_message(%ModerationLog{
|
||||||
"@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}"
|
"@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_log_entry_message(ModerationLog) :: String.t()
|
|
||||||
def get_log_entry_message(%ModerationLog{
|
def get_log_entry_message(%ModerationLog{
|
||||||
data: %{
|
data: %{
|
||||||
"actor" => %{"nickname" => actor_nickname},
|
"actor" => %{"nickname" => actor_nickname},
|
||||||
|
@ -676,4 +569,16 @@ defp users_to_nicknames_string(users) do
|
||||||
|> Enum.map(&"@#{&1["nickname"]}")
|
|> Enum.map(&"@#{&1["nickname"]}")
|
||||||
|> Enum.join(", ")
|
|> Enum.join(", ")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp subject_actor_nickname(%ModerationLog{data: data}, prefix_msg, postfix_msg \\ "") do
|
||||||
|
case data do
|
||||||
|
%{"subject_actor" => %{"nickname" => subject_actor}} ->
|
||||||
|
[prefix_msg, "@#{subject_actor}", postfix_msg]
|
||||||
|
|> Enum.reject(&(&1 == ""))
|
||||||
|
|> Enum.join()
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
""
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -473,6 +473,18 @@ def remote_user_changeset(struct \\ %User{local: false}, params) do
|
||||||
|> validate_length(:bio, max: bio_limit)
|
|> validate_length(:bio, max: bio_limit)
|
||||||
|> validate_length(:name, max: name_limit)
|
|> validate_length(:name, max: name_limit)
|
||||||
|> validate_fields(true)
|
|> validate_fields(true)
|
||||||
|
|> validate_non_local()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp validate_non_local(cng) do
|
||||||
|
local? = get_field(cng, :local)
|
||||||
|
|
||||||
|
if local? do
|
||||||
|
cng
|
||||||
|
|> add_error(:local, "User is local, can't update with this changeset.")
|
||||||
|
else
|
||||||
|
cng
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_changeset(struct, params \\ %{}) do
|
def update_changeset(struct, params \\ %{}) do
|
||||||
|
|
|
@ -50,10 +50,13 @@ def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn,
|
||||||
Enum.map(reports, fn report ->
|
Enum.map(reports, fn report ->
|
||||||
case CommonAPI.update_report_state(report.id, report.state) do
|
case CommonAPI.update_report_state(report.id, report.state) do
|
||||||
{:ok, activity} ->
|
{:ok, activity} ->
|
||||||
|
report = Activity.get_by_id_with_user_actor(activity.id)
|
||||||
|
|
||||||
ModerationLog.insert_log(%{
|
ModerationLog.insert_log(%{
|
||||||
action: "report_update",
|
action: "report_update",
|
||||||
actor: admin,
|
actor: admin,
|
||||||
subject: activity
|
subject: activity,
|
||||||
|
subject_actor: report.user_actor
|
||||||
})
|
})
|
||||||
|
|
||||||
activity
|
activity
|
||||||
|
@ -73,11 +76,13 @@ def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn,
|
||||||
def notes_create(%{assigns: %{user: user}, body_params: %{content: content}} = conn, %{
|
def notes_create(%{assigns: %{user: user}, body_params: %{content: content}} = conn, %{
|
||||||
id: report_id
|
id: report_id
|
||||||
}) do
|
}) do
|
||||||
with {:ok, _} <- ReportNote.create(user.id, report_id, content) do
|
with {:ok, _} <- ReportNote.create(user.id, report_id, content),
|
||||||
|
report <- Activity.get_by_id_with_user_actor(report_id) do
|
||||||
ModerationLog.insert_log(%{
|
ModerationLog.insert_log(%{
|
||||||
action: "report_note",
|
action: "report_note",
|
||||||
actor: user,
|
actor: user,
|
||||||
subject: Activity.get_by_id(report_id),
|
subject: report,
|
||||||
|
subject_actor: report.user_actor,
|
||||||
text: content
|
text: content
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -91,11 +96,13 @@ def notes_delete(%{assigns: %{user: user}} = conn, %{
|
||||||
id: note_id,
|
id: note_id,
|
||||||
report_id: report_id
|
report_id: report_id
|
||||||
}) do
|
}) do
|
||||||
with {:ok, note} <- ReportNote.destroy(note_id) do
|
with {:ok, note} <- ReportNote.destroy(note_id),
|
||||||
|
report <- Activity.get_by_id_with_user_actor(report_id) do
|
||||||
ModerationLog.insert_log(%{
|
ModerationLog.insert_log(%{
|
||||||
action: "report_note_delete",
|
action: "report_note_delete",
|
||||||
actor: user,
|
actor: user,
|
||||||
subject: Activity.get_by_id(report_id),
|
subject: report,
|
||||||
|
subject_actor: report.user_actor,
|
||||||
text: note.content
|
text: note.content
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
2
mix.exs
2
mix.exs
|
@ -158,7 +158,7 @@ defp deps do
|
||||||
{:floki, "~> 0.27"},
|
{:floki, "~> 0.27"},
|
||||||
{:timex, "~> 3.6"},
|
{:timex, "~> 3.6"},
|
||||||
{:ueberauth, "~> 0.4"},
|
{:ueberauth, "~> 0.4"},
|
||||||
{:linkify, "~> 0.3.0"},
|
{:linkify, "~> 0.4.0"},
|
||||||
{:http_signatures, "~> 0.1.0"},
|
{:http_signatures, "~> 0.1.0"},
|
||||||
{:telemetry, "~> 0.3"},
|
{:telemetry, "~> 0.3"},
|
||||||
{:poolboy, "~> 1.5"},
|
{:poolboy, "~> 1.5"},
|
||||||
|
|
2
mix.lock
2
mix.lock
|
@ -65,7 +65,7 @@
|
||||||
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
||||||
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
||||||
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
||||||
"linkify": {:hex, :linkify, "0.3.0", "0786296f06c3cc5455c3cbc786e575e5c381f76f8c7cb79eba495eef66617aeb", [:mix], [], "hexpm", "47e6a6e2c98815b238017331c3fbcf04aaa0644e323e6c260ee0111ed43f696c"},
|
"linkify": {:hex, :linkify, "0.4.0", "7845b6ac33050a41acaf9318923ce6e7f3854418be9a5f22184de103f7a68ff9", [:mix], [], "hexpm", "a0ceb4c78591fecccf1d99fecc10c13dba75a307c663c80e28af9e2cdd9776ee"},
|
||||||
"majic": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/majic.git", "4c692e544b28d1f5e543fb8a44be090f8cd96f80", [branch: "develop"]},
|
"majic": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/majic.git", "4c692e544b28d1f5e543fb8a44be090f8cd96f80", [branch: "develop"]},
|
||||||
"makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"},
|
"makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
|
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
|
||||||
|
|
|
@ -36,7 +36,7 @@ test "user is created" do
|
||||||
unsaved = build(:user)
|
unsaved = build(:user)
|
||||||
|
|
||||||
# prepare to answer yes
|
# prepare to answer yes
|
||||||
send(self(), {:mix_shell_input, :yes?, true})
|
send(self(), {:mix_shell_input, :prompt, "Y"})
|
||||||
|
|
||||||
Mix.Tasks.Pleroma.User.run([
|
Mix.Tasks.Pleroma.User.run([
|
||||||
"new",
|
"new",
|
||||||
|
@ -55,7 +55,7 @@ test "user is created" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ "user will be created"
|
assert message =~ "user will be created"
|
||||||
|
|
||||||
assert_received {:mix_shell, :yes?, [message]}
|
assert_received {:mix_shell, :prompt, [message]}
|
||||||
assert message =~ "Continue"
|
assert message =~ "Continue"
|
||||||
|
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
|
@ -73,14 +73,14 @@ test "user is not created" do
|
||||||
unsaved = build(:user)
|
unsaved = build(:user)
|
||||||
|
|
||||||
# prepare to answer no
|
# prepare to answer no
|
||||||
send(self(), {:mix_shell_input, :yes?, false})
|
send(self(), {:mix_shell_input, :prompt, "N"})
|
||||||
|
|
||||||
Mix.Tasks.Pleroma.User.run(["new", unsaved.nickname, unsaved.email])
|
Mix.Tasks.Pleroma.User.run(["new", unsaved.nickname, unsaved.email])
|
||||||
|
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ "user will be created"
|
assert message =~ "user will be created"
|
||||||
|
|
||||||
assert_received {:mix_shell, :yes?, [message]}
|
assert_received {:mix_shell, :prompt, [message]}
|
||||||
assert message =~ "Continue"
|
assert message =~ "Continue"
|
||||||
|
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
|
|
|
@ -21,6 +21,7 @@ test "it finds something" do
|
||||||
test "using plainto_tsquery on postgres < 11" do
|
test "using plainto_tsquery on postgres < 11" do
|
||||||
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
||||||
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
||||||
|
on_exit(fn -> :persistent_term.put({Pleroma.Repo, :postgres_version}, old_version) end)
|
||||||
|
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, post} = CommonAPI.post(user, %{status: "it's wednesday my dudes"})
|
{:ok, post} = CommonAPI.post(user, %{status: "it's wednesday my dudes"})
|
||||||
|
@ -30,8 +31,6 @@ test "using plainto_tsquery on postgres < 11" do
|
||||||
assert [result] = Search.search(nil, "wednesday -dudes")
|
assert [result] = Search.search(nil, "wednesday -dudes")
|
||||||
|
|
||||||
assert result.id == post.id
|
assert result.id == post.id
|
||||||
|
|
||||||
:persistent_term.put({Pleroma.Repo, :postgres_version}, old_version)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "using websearch_to_tsquery" do
|
test "using websearch_to_tsquery" do
|
||||||
|
|
|
@ -197,6 +197,13 @@ test "all_by_ids_with_object/1" do
|
||||||
assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
|
assert [%{id: ^id1, object: %Object{}}, %{id: ^id2, object: %Object{}}] = activities
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "get_by_id_with_user_actor/1" do
|
||||||
|
user = insert(:user)
|
||||||
|
activity = insert(:note_activity, note: insert(:note, user: user))
|
||||||
|
|
||||||
|
assert Activity.get_by_id_with_user_actor(activity.id).user_actor == user
|
||||||
|
end
|
||||||
|
|
||||||
test "get_by_id_with_object/1" do
|
test "get_by_id_with_object/1" do
|
||||||
%{id: id} = insert(:note_activity)
|
%{id: id} = insert(:note_activity)
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,22 @@ defmodule Pleroma.EmojiTest do
|
||||||
describe "is_unicode_emoji?/1" do
|
describe "is_unicode_emoji?/1" do
|
||||||
test "tells if a string is an unicode emoji" do
|
test "tells if a string is an unicode emoji" do
|
||||||
refute Emoji.is_unicode_emoji?("X")
|
refute Emoji.is_unicode_emoji?("X")
|
||||||
assert Emoji.is_unicode_emoji?("☂")
|
refute Emoji.is_unicode_emoji?("ね")
|
||||||
|
|
||||||
|
# Only accept fully-qualified (RGI) emoji
|
||||||
|
# See http://www.unicode.org/reports/tr51/
|
||||||
|
refute Emoji.is_unicode_emoji?("❤")
|
||||||
|
refute Emoji.is_unicode_emoji?("☂")
|
||||||
|
|
||||||
assert Emoji.is_unicode_emoji?("🥺")
|
assert Emoji.is_unicode_emoji?("🥺")
|
||||||
|
assert Emoji.is_unicode_emoji?("🤰")
|
||||||
|
assert Emoji.is_unicode_emoji?("❤️")
|
||||||
|
assert Emoji.is_unicode_emoji?("🏳️⚧️")
|
||||||
|
|
||||||
|
# Additionally, we accept regional indicators.
|
||||||
|
assert Emoji.is_unicode_emoji?("🇵")
|
||||||
|
assert Emoji.is_unicode_emoji?("🇴")
|
||||||
|
assert Emoji.is_unicode_emoji?("🇬")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -241,16 +241,14 @@ test "it can parse mentions and return the relevant users" do
|
||||||
"@@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me and @o and @@@jimm"
|
"@@gsimg According to @archaeme, that is @daggsy. Also hello @archaeme@archae.me and @o and @@@jimm"
|
||||||
|
|
||||||
o = insert(:user, %{nickname: "o"})
|
o = insert(:user, %{nickname: "o"})
|
||||||
jimm = insert(:user, %{nickname: "jimm"})
|
_jimm = insert(:user, %{nickname: "jimm"})
|
||||||
gsimg = insert(:user, %{nickname: "gsimg"})
|
_gsimg = insert(:user, %{nickname: "gsimg"})
|
||||||
archaeme = insert(:user, %{nickname: "archaeme"})
|
archaeme = insert(:user, %{nickname: "archaeme"})
|
||||||
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"})
|
archaeme_remote = insert(:user, %{nickname: "archaeme@archae.me"})
|
||||||
|
|
||||||
expected_mentions = [
|
expected_mentions = [
|
||||||
{"@archaeme", archaeme},
|
{"@archaeme", archaeme},
|
||||||
{"@archaeme@archae.me", archaeme_remote},
|
{"@archaeme@archae.me", archaeme_remote},
|
||||||
{"@gsimg", gsimg},
|
|
||||||
{"@jimm", jimm},
|
|
||||||
{"@o", o}
|
{"@o", o}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -182,11 +182,14 @@ test "logging relay unfollow", %{moderator: moderator} do
|
||||||
end
|
end
|
||||||
|
|
||||||
test "logging report update", %{moderator: moderator} do
|
test "logging report update", %{moderator: moderator} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
report = %Activity{
|
report = %Activity{
|
||||||
id: "9m9I1F4p8ftrTP6QTI",
|
id: "9m9I1F4p8ftrTP6QTI",
|
||||||
data: %{
|
data: %{
|
||||||
"type" => "Flag",
|
"type" => "Flag",
|
||||||
"state" => "resolved"
|
"state" => "resolved",
|
||||||
|
"actor" => user.ap_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,35 +197,48 @@ test "logging report update", %{moderator: moderator} do
|
||||||
ModerationLog.insert_log(%{
|
ModerationLog.insert_log(%{
|
||||||
actor: moderator,
|
actor: moderator,
|
||||||
action: "report_update",
|
action: "report_update",
|
||||||
subject: report
|
subject: report,
|
||||||
|
subject_actor: user
|
||||||
})
|
})
|
||||||
|
|
||||||
log = Repo.one(ModerationLog)
|
log = Repo.one(ModerationLog)
|
||||||
|
|
||||||
assert log.data["message"] ==
|
assert log.data["message"] ==
|
||||||
"@#{moderator.nickname} updated report ##{report.id} with 'resolved' state"
|
"@#{moderator.nickname} updated report ##{report.id} (on user @#{user.nickname}) with 'resolved' state"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "logging report response", %{moderator: moderator} do
|
test "logging report response", %{moderator: moderator} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
report = %Activity{
|
report = %Activity{
|
||||||
id: "9m9I1F4p8ftrTP6QTI",
|
id: "9m9I1F4p8ftrTP6QTI",
|
||||||
data: %{
|
data: %{
|
||||||
"type" => "Note"
|
"type" => "Note",
|
||||||
|
"actor" => user.ap_id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, _} =
|
attrs = %{
|
||||||
ModerationLog.insert_log(%{
|
|
||||||
actor: moderator,
|
actor: moderator,
|
||||||
action: "report_note",
|
action: "report_note",
|
||||||
subject: report,
|
subject: report,
|
||||||
text: "look at this"
|
text: "look at this"
|
||||||
})
|
}
|
||||||
|
|
||||||
log = Repo.one(ModerationLog)
|
{:ok, log1} = ModerationLog.insert_log(attrs)
|
||||||
|
log = Repo.get(ModerationLog, log1.id)
|
||||||
|
|
||||||
assert log.data["message"] ==
|
assert log.data["message"] ==
|
||||||
"@#{moderator.nickname} added note 'look at this' to report ##{report.id}"
|
"@#{moderator.nickname} added note 'look at this' to report ##{report.id}"
|
||||||
|
|
||||||
|
{:ok, log2} = ModerationLog.insert_log(Map.merge(attrs, %{subject_actor: user}))
|
||||||
|
|
||||||
|
log = Repo.get(ModerationLog, log2.id)
|
||||||
|
|
||||||
|
assert log.data["message"] ==
|
||||||
|
"@#{moderator.nickname} added note 'look at this' to report ##{report.id} on user @#{
|
||||||
|
user.nickname
|
||||||
|
}"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "logging status sensitivity update", %{moderator: moderator} do
|
test "logging status sensitivity update", %{moderator: moderator} do
|
||||||
|
|
|
@ -895,6 +895,13 @@ test "it has required fields" do
|
||||||
refute cs.valid?
|
refute cs.valid?
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it is invalid given a local user" do
|
||||||
|
user = insert(:user)
|
||||||
|
cs = User.remote_user_changeset(user, %{name: "tom from myspace"})
|
||||||
|
|
||||||
|
refute cs.valid?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "followers and friends" do
|
describe "followers and friends" do
|
||||||
|
|
|
@ -108,7 +108,7 @@ test "it blocks but does not unfollow if the relevant setting is set", %{
|
||||||
|
|
||||||
describe "update users" do
|
describe "update users" do
|
||||||
setup do
|
setup do
|
||||||
user = insert(:user)
|
user = insert(:user, local: false)
|
||||||
{:ok, update_data, []} = Builder.update(user, %{"id" => user.ap_id, "name" => "new name!"})
|
{:ok, update_data, []} = Builder.update(user, %{"id" => user.ap_id, "name" => "new name!"})
|
||||||
{:ok, update, _meta} = ActivityPub.persist(update_data, local: true)
|
{:ok, update, _meta} = ActivityPub.persist(update_data, local: true)
|
||||||
|
|
||||||
|
|
|
@ -122,13 +122,13 @@ test "mark report as resolved", %{conn: conn, id: id, admin: admin} do
|
||||||
})
|
})
|
||||||
|> json_response_and_validate_schema(:no_content)
|
|> json_response_and_validate_schema(:no_content)
|
||||||
|
|
||||||
activity = Activity.get_by_id(id)
|
activity = Activity.get_by_id_with_user_actor(id)
|
||||||
assert activity.data["state"] == "resolved"
|
assert activity.data["state"] == "resolved"
|
||||||
|
|
||||||
log_entry = Repo.one(ModerationLog)
|
log_entry = Repo.one(ModerationLog)
|
||||||
|
|
||||||
assert ModerationLog.get_log_entry_message(log_entry) ==
|
assert ModerationLog.get_log_entry_message(log_entry) ==
|
||||||
"@#{admin.nickname} updated report ##{id} with 'resolved' state"
|
"@#{admin.nickname} updated report ##{id} (on user @#{activity.user_actor.nickname}) with 'resolved' state"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "closes report", %{conn: conn, id: id, admin: admin} do
|
test "closes report", %{conn: conn, id: id, admin: admin} do
|
||||||
|
@ -141,13 +141,13 @@ test "closes report", %{conn: conn, id: id, admin: admin} do
|
||||||
})
|
})
|
||||||
|> json_response_and_validate_schema(:no_content)
|
|> json_response_and_validate_schema(:no_content)
|
||||||
|
|
||||||
activity = Activity.get_by_id(id)
|
activity = Activity.get_by_id_with_user_actor(id)
|
||||||
assert activity.data["state"] == "closed"
|
assert activity.data["state"] == "closed"
|
||||||
|
|
||||||
log_entry = Repo.one(ModerationLog)
|
log_entry = Repo.one(ModerationLog)
|
||||||
|
|
||||||
assert ModerationLog.get_log_entry_message(log_entry) ==
|
assert ModerationLog.get_log_entry_message(log_entry) ==
|
||||||
"@#{admin.nickname} updated report ##{id} with 'closed' state"
|
"@#{admin.nickname} updated report ##{id} (on user @#{activity.user_actor.nickname}) with 'closed' state"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns 400 when state is unknown", %{conn: conn, id: id} do
|
test "returns 400 when state is unknown", %{conn: conn, id: id} do
|
||||||
|
@ -193,18 +193,20 @@ test "updates state of multiple reports", %{
|
||||||
})
|
})
|
||||||
|> json_response_and_validate_schema(:no_content)
|
|> json_response_and_validate_schema(:no_content)
|
||||||
|
|
||||||
activity = Activity.get_by_id(id)
|
activity = Activity.get_by_id_with_user_actor(id)
|
||||||
second_activity = Activity.get_by_id(second_report_id)
|
second_activity = Activity.get_by_id_with_user_actor(second_report_id)
|
||||||
assert activity.data["state"] == "resolved"
|
assert activity.data["state"] == "resolved"
|
||||||
assert second_activity.data["state"] == "closed"
|
assert second_activity.data["state"] == "closed"
|
||||||
|
|
||||||
[first_log_entry, second_log_entry] = Repo.all(ModerationLog)
|
[first_log_entry, second_log_entry] = Repo.all(ModerationLog)
|
||||||
|
|
||||||
assert ModerationLog.get_log_entry_message(first_log_entry) ==
|
assert ModerationLog.get_log_entry_message(first_log_entry) ==
|
||||||
"@#{admin.nickname} updated report ##{id} with 'resolved' state"
|
"@#{admin.nickname} updated report ##{id} (on user @#{activity.user_actor.nickname}) with 'resolved' state"
|
||||||
|
|
||||||
assert ModerationLog.get_log_entry_message(second_log_entry) ==
|
assert ModerationLog.get_log_entry_message(second_log_entry) ==
|
||||||
"@#{admin.nickname} updated report ##{second_report_id} with 'closed' state"
|
"@#{admin.nickname} updated report ##{second_report_id} (on user @#{
|
||||||
|
second_activity.user_actor.nickname
|
||||||
|
}) with 'closed' state"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
defmodule Pleroma.Web.AdminAPI.ModerationLogViewTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Web.AdminAPI.ModerationLogView
|
||||||
|
|
||||||
|
describe "renders `report_note_delete` log messages" do
|
||||||
|
setup do
|
||||||
|
log1 = %Pleroma.ModerationLog{
|
||||||
|
data: %{
|
||||||
|
"action" => "report_note_delete",
|
||||||
|
"actor" => %{"id" => "A1I7G8", "nickname" => "admin", "type" => "user"},
|
||||||
|
"message" => "@admin deleted note 'mistake' from report #A1I7be on user @b-612",
|
||||||
|
"subject" => %{"id" => "A1I7be", "state" => "open", "type" => "report"},
|
||||||
|
"subject_actor" => %{"id" => "A1I7G8", "nickname" => "b-612", "type" => "user"},
|
||||||
|
"text" => "mistake"
|
||||||
|
},
|
||||||
|
inserted_at: ~N[2020-11-17 14:13:20]
|
||||||
|
}
|
||||||
|
|
||||||
|
log2 = %Pleroma.ModerationLog{
|
||||||
|
data: %{
|
||||||
|
"action" => "report_note_delete",
|
||||||
|
"actor" => %{"id" => "A1I7G8", "nickname" => "admin", "type" => "user"},
|
||||||
|
"message" => "@admin deleted note 'fake user' from report #A1I7be on user @j-612",
|
||||||
|
"subject" => %{"id" => "A1I7be", "state" => "open", "type" => "report"},
|
||||||
|
"subject_actor" => %{"id" => "A1I7G8", "nickname" => "j-612", "type" => "user"},
|
||||||
|
"text" => "fake user"
|
||||||
|
},
|
||||||
|
inserted_at: ~N[2020-11-17 14:13:20]
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, %{log1: log1, log2: log2}}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "renders `report_note_delete` log messages", %{log1: log1, log2: log2} do
|
||||||
|
assert ModerationLogView.render(
|
||||||
|
"index.json",
|
||||||
|
%{log: %{items: [log1, log2], count: 2}}
|
||||||
|
) == %{
|
||||||
|
items: [
|
||||||
|
%{
|
||||||
|
data: %{
|
||||||
|
"action" => "report_note_delete",
|
||||||
|
"actor" => %{"id" => "A1I7G8", "nickname" => "admin", "type" => "user"},
|
||||||
|
"message" =>
|
||||||
|
"@admin deleted note 'mistake' from report #A1I7be on user @b-612",
|
||||||
|
"subject" => %{"id" => "A1I7be", "state" => "open", "type" => "report"},
|
||||||
|
"subject_actor" => %{
|
||||||
|
"id" => "A1I7G8",
|
||||||
|
"nickname" => "b-612",
|
||||||
|
"type" => "user"
|
||||||
|
},
|
||||||
|
"text" => "mistake"
|
||||||
|
},
|
||||||
|
message: "@admin deleted note 'mistake' from report #A1I7be on user @b-612",
|
||||||
|
time: 1_605_622_400
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
data: %{
|
||||||
|
"action" => "report_note_delete",
|
||||||
|
"actor" => %{"id" => "A1I7G8", "nickname" => "admin", "type" => "user"},
|
||||||
|
"message" =>
|
||||||
|
"@admin deleted note 'fake user' from report #A1I7be on user @j-612",
|
||||||
|
"subject" => %{"id" => "A1I7be", "state" => "open", "type" => "report"},
|
||||||
|
"subject_actor" => %{
|
||||||
|
"id" => "A1I7G8",
|
||||||
|
"nickname" => "j-612",
|
||||||
|
"type" => "user"
|
||||||
|
},
|
||||||
|
"text" => "fake user"
|
||||||
|
},
|
||||||
|
message: "@admin deleted note 'fake user' from report #A1I7be on user @j-612",
|
||||||
|
time: 1_605_622_400
|
||||||
|
}
|
||||||
|
],
|
||||||
|
total: 2
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "renders `report_note_delete` log message", %{log1: log} do
|
||||||
|
assert ModerationLogView.render("show.json", %{log_entry: log}) == %{
|
||||||
|
data: %{
|
||||||
|
"action" => "report_note_delete",
|
||||||
|
"actor" => %{"id" => "A1I7G8", "nickname" => "admin", "type" => "user"},
|
||||||
|
"message" => "@admin deleted note 'mistake' from report #A1I7be on user @b-612",
|
||||||
|
"subject" => %{"id" => "A1I7be", "state" => "open", "type" => "report"},
|
||||||
|
"subject_actor" => %{"id" => "A1I7G8", "nickname" => "b-612", "type" => "user"},
|
||||||
|
"text" => "mistake"
|
||||||
|
},
|
||||||
|
message: "@admin deleted note 'mistake' from report #A1I7be on user @b-612",
|
||||||
|
time: 1_605_622_400
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -281,6 +281,7 @@ test "search", %{conn: conn} do
|
||||||
test "search fetches remote statuses and prefers them over other results", %{conn: conn} do
|
test "search fetches remote statuses and prefers them over other results", %{conn: conn} do
|
||||||
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
old_version = :persistent_term.get({Pleroma.Repo, :postgres_version})
|
||||||
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
:persistent_term.put({Pleroma.Repo, :postgres_version}, 10.0)
|
||||||
|
on_exit(fn -> :persistent_term.put({Pleroma.Repo, :postgres_version}, old_version) end)
|
||||||
|
|
||||||
capture_log(fn ->
|
capture_log(fn ->
|
||||||
{:ok, %{id: activity_id}} =
|
{:ok, %{id: activity_id}} =
|
||||||
|
@ -298,8 +299,6 @@ test "search fetches remote statuses and prefers them over other results", %{con
|
||||||
%{"id" => ^activity_id}
|
%{"id" => ^activity_id}
|
||||||
] = results["statuses"]
|
] = results["statuses"]
|
||||||
end)
|
end)
|
||||||
|
|
||||||
:persistent_term.put({Pleroma.Repo, :postgres_version}, old_version)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "search doesn't show statuses that it shouldn't", %{conn: conn} do
|
test "search doesn't show statuses that it shouldn't", %{conn: conn} do
|
||||||
|
|
Loading…
Reference in a new issue