Autosave: 20260216-130929
This commit is contained in:
parent
77269fa65c
commit
e6233598d6
@ -652,6 +652,22 @@ body {
|
||||
.dm-status-online { background-color: #23a559; }
|
||||
.dm-status-offline { background-color: #80848e; }
|
||||
|
||||
/* Custom Scrollbar */
|
||||
.custom-scrollbar::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
}
|
||||
.custom-scrollbar::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
.custom-scrollbar::-webkit-scrollbar-thumb {
|
||||
background: #1e1f22;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
|
||||
background: #1a1b1e;
|
||||
}
|
||||
|
||||
.emoji-picker {
|
||||
position: fixed;
|
||||
background-color: #1e1f22;
|
||||
|
||||
@ -27,103 +27,221 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
}
|
||||
|
||||
// Emoji list categorized
|
||||
// Unified Emoji Categories - Expanded for "Complete" feel
|
||||
const EMOJI_CATEGORIES = {
|
||||
'Smileys': ['๐', '๐', '๐', '๐', '๐', '๐
', '๐คฃ', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฅฐ', '๐', '๐คฉ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐คช', '๐', '๐ค', '๐ค', '๐คญ', '๐คซ', '๐ค', '๐ค', '๐คจ', '๐', '๐', '๐ถ', '๐', '๐', '๐', '๐ฌ', '๐คฅ', '๐', '๐', '๐ช', '๐คค', '๐ด', '๐ท', '๐ค', '๐ค', '๐คข', '๐คฎ', '๐คง', '๐ฅต', '๐ฅถ', '๐ฅด', '๐ต', '๐คฏ', '๐ค ', '๐ฅณ', '๐', '๐ค', '๐ง', '๐', '๐', '๐', 'โน๏ธ', '๐ฎ', '๐ฏ', '๐ฒ', '๐ณ', '๐ฅบ', '๐ฆ', '๐ง', '๐จ', '๐ฐ', '๐ฅ', '๐ข', '๐ญ', '๐ฑ', '๐', '๐ฃ', '๐', '๐', '๐ฉ', '๐ซ', '๐ฅฑ', '๐ค', '๐ก', '๐ ', '๐คฌ', '๐', '๐ฟ', '๐น', '๐บ', '๐', 'โ ๏ธ', '๐ฉ', '๐คก', '๐น', '๐บ', '๐ป', '๐ฝ', '๐พ', '๐ค', '๐บ', '๐ธ', '๐ป', '๐ผ', '๐ฝ', '๐', '๐ฟ', '๐พ'],
|
||||
'People': ['๐', '๐ค', '๐๏ธ', 'โ', '๐', '๐', '๐ค', 'โ๏ธ', '๐ค', '๐ค', '๐ค', '๐ค', '๐', '๐', '๐', '๐', '๐', 'โ๏ธ', '๐', '๐', 'โ', '๐', '๐ค', '๐ค', '๐', '๐', '๐', '๐คฒ', '๐ค', '๐', 'โ๏ธ', '๐
', '๐คณ', '๐ช', '๐ฆพ', '๐ฆต', '๐ฆฟ', '๐ฆถ', '๐', '๐ฆป', '๐', '๐ง ', '๐ฆท', '๐ฆด', '๐', '๐๏ธ', '๐
', '๐', '๐ถ', '๐ง', '๐ฆ', '๐ง', '๐ง', '๐ฑ', '๐จ', '๐ง', '๐ฉ', '๐ง', '๐ด', '๐ต', '๐ฎ', '๐ต๏ธ', '๐', '๐ท', '๐คด', '๐ธ', '๐ณ', '๐ฒ', '๐ง', '๐คต', '๐ฐ', '๐คฐ', '๐คฑ', '๐ผ', '๐
', '๐คถ', '๐ฆธ', '๐ฆน', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐', '๐', '๐ถ', '๐', '๐', '๐บ', '๐ด๏ธ', '๐ฏ', '๐ง', '๐ง'],
|
||||
'Animals': ['๐ถ', '๐ฑ', '๐ญ', '๐น', '๐ฐ', '๐ฆ', '๐ป', '๐ผ', '๐จ', '๐ฏ', '๐ฆ', '๐ฎ', '๐ท', '๐ฝ', '๐ธ', '๐ต', '๐', '๐', '๐', '๐', '๐', '๐ง', '๐ฆ', '๐ค', '๐ฃ', '๐ฅ', '๐ฆ', '๐ฆ
', '๐ฆ', '๐ฆ', '๐บ', '๐', '๐ด', '๐ฆ', '๐', '๐', '๐ฆ', '๐', '๐', '๐', '๐ฆ', '๐ฆ', '๐ท๏ธ', '๐ธ๏ธ', '่ ', '๐ข', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐ฆ', '๐ก', '๐ ', '๐', '๐ฌ', '๐ณ', '๐', '๐ฆ', '๐', '๐
', '๐', '๐ฆ', '๐ฆ', '๐ฆง', '๐', '๐ฆ', '๐ฆ', '๐ช', '๐ซ', '๐ฆ', '๐ฆ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฆ', '๐', '๐ฉ', '๐ฆฎ', '๐', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐ฆข', '๐ฆฉ', '๐๏ธ', '๐', '๐ฆ', '๐ฆจ', '๐ฆก', '๐ฆฆ', '๐ฆฅ', '๐', '๐', '๐ฟ๏ธ', '๐ฆ'],
|
||||
'Nature': ['๐ต', '๐', '๐ฒ', '๐ณ', '๐ด', '๐ฑ', '๐ฟ', 'โ๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐พ', '๐', '๐ท', '๐น', '๐ฅ', '๐บ', '๐ธ', '๐ผ', '๐ป', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ช', '๐ซ', 'โญ๏ธ', '๐', 'โจ', 'โก๏ธ', 'โ๏ธ', '๐ฅ', '๐ฅ', '๐ช๏ธ', '๐', 'โ๏ธ', '๐ค๏ธ', 'โ
๏ธ', '๐ฅ๏ธ', 'โ๏ธ', '๐ฆ๏ธ', '๐ง๏ธ', '๐จ๏ธ', '๐ฉ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', '๐ฌ๏ธ', '๐จ', '๐ง', '๐ฆ', 'โ๏ธ', 'โ๏ธ', '๐', '๐ซ๏ธ'],
|
||||
'Food': ['๐', '๐', '๐', '๐', '๐', ' BANANA', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฅญ', '๐', '๐ฅฅ', '๐ฅ', '๐
', '๐', '๐ฅ', '๐ฅฆ', '๐ฅฌ', '๐ฅ', '๐ฝ', '๐ฅ', '๐ง', '๐ฅ', '๐ ', '๐ฅ', '๐ฅฏ', '๐', '๐ฅ', '๐ฅจ', '๐ง', '๐ฅ', '๐ณ', '๐ง', '๐ฅ', ' waffle', '๐ฅ', '๐ฅฉ', '๐', '๐', '๐ฆด', '๐ญ', '๐', '๐', '๐', '๐ฅช', '๐ฅ', '๐ง', '๐ฎ', '๐ฏ', '๐ฅ', '๐ฅ', '๐', '๐', '๐ฒ', '๐', ' sushi', ' Bento', ' Dumpling', ' Oyster', '๐ค', ' Rice Ball', ' Rice', ' Rice Cracker', '๐ฅ', '๐ฅ ', '๐ฅฎ', '๐ข', '๐ก', '๐ง', '๐จ', '๐ฆ', '๐ฅง', '๐ง', '๐ฐ', '๐', '๐ฎ', '๐ญ', '๐ฌ', '๐ซ', ' popcorn', '๐ฉ', '๐ช', '๐ฐ', ' peanuts', '๐ฏ', '๐ฅ', 'โ๏ธ', '๐ต', '๐ฅค', '๐ถ', '๐บ', '๐ป', '๐ฅ', '๐ท', '๐ฅ', '๐ธ', '๐น', '๐ง', '๐พ', '๐ง', '๐ฅ', '๐ด', '๐ฝ๏ธ', '๐ฅฃ', '๐ฅก'],
|
||||
'Travel': ['๐', '๐', '๐', '๐', '๐', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ต', '๐ฒ', '๐ด', '๐', '๐ฃ๏ธ', '๐ค๏ธ', 'โฝ๏ธ', '๐จ', '๐ฅ', '๐ฆ', '๐ง', 'โ๏ธ', 'โต๏ธ', '๐ค', '๐ณ๏ธ', 'โด๏ธ', '๐ข', 'โ๏ธ', '๐ซ', '๐ฌ', '๐บ', '๐', '๐', '๐ ', '๐ก', '๐', '๐ธ', '๐ฐ๏ธ', 'โ๏ธ', 'โณ', 'โ๏ธ', 'โฐ', 'โฑ๏ธ', 'โฒ๏ธ', '๐ฐ๏ธ', '๐ก๏ธ', 'โ๏ธ', '๐ช', '๐', 'โ๏ธ', 'โ
๏ธ', 'โ๏ธ', '๐', 'โฐ๏ธ', '๐๏ธ', '๐ป', '๐', '๐๏ธ', '๐๏ธ', 'โบ๏ธ', '๐ ', '๐ก', '๐ข', '๐ฃ', '๐ค', '๐ฅ', '๐ฆ', '๐จ', '๐ฉ', '๐ช', '๐ซ', '๐ฌ', '๐ญ', '๐ฏ', '๐ฐ', '๐', '๐ผ', '๐ฝ', 'โช๏ธ', '๐', '๐', 'โฉ๏ธ', '๐', 'โฒ๏ธ', '๐', '๐', '๐๏ธ', '๐', '๐
', '๐', '๐', '๐', '๐ ', '๐ก', '๐ข', '๐', '๐', '๐', '๐
', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐'],
|
||||
'Activities': ['โฝ๏ธ', '๐', '๐', 'โพ๏ธ', '๐ฅ', '๐พ', '๐', '๐', '๐ฑ', '๐', '๐ธ', '๐ฅ
', ' hockey', ' field hockey', ' cricket', 'โณ๏ธ', '๐น', '๐ฃ', ' boxing', '๐ฅ', ' skateboard', '๐ท', 'โธ๏ธ', '๐ฅ', '๐ฟ', 'โท๏ธ', '๐', '๐๏ธ', ' fencing', '๐คผ', ' gymnastics', ' basketball player', '๐คฝ', ' handball', ' juggle', '๐ง', '๐', ' rowing', ' swimming', '๐ด', '๐ต', '๐ง', '๐๏ธ', '๐', '๐
', '๐ฅ', '๐ฅ', '๐ฅ', '๐ซ', '๐๏ธ', '๐ญ', '๐จ', '๐ฌ', '๐ค', '๐ง', '๐ผ', '๐น', '๐ฅ', '๐ท', '๐บ', '๐ธ', '๐ช', '๐ป', '๐ฒ', 'โ๏ธ', '๐ฏ', '๐ณ', '๐ฎ', '๐ฐ', '๐งฉ'],
|
||||
'Objects': ['โ๏ธ', '๐ฑ', '๐ฒ', '๐ป', 'โจ๏ธ', '๐ฑ๏ธ', '๐ฒ๏ธ', '๐น๏ธ', '๐๏ธ', '๐ฝ', '๐พ', '๐ฟ', '๐๏ธ', '๐ท', '๐ธ', '๐น', '๐ผ', '๐', '๐', '๐ฏ๏ธ', '๐ก', '๐ฆ', '๐ฎ', '๐ช', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฐ', '๐๏ธ', '๐', '๐', '๐ท๏ธ', '๐ฐ', '๐ด', '๐ต', '๐ถ', '๐ท', '๐ธ', '๐ณ', '๐งพ', '๐น', 'โ๏ธ', '๐ง', '๐จ', '๐ฉ', '๐ค', '๐ฅ', '๐ฆ', '๐ซ', '๐ฉ', '๐ฌ', '๐ญ', '๐ฎ', '๐ณ๏ธ', 'โ๏ธ', 'โ๏ธ', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐', '๐ผ', '๐', '๐', '๐๏ธ', '๐
', '๐', '๐๏ธ', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐๏ธ', '๐', '๐', 'โ๏ธ', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐๏ธ', '๐จ', '๐ช', 'โ๏ธ', 'โ๏ธ', '๐ ๏ธ', '๐ก๏ธ', 'โ๏ธ', '๐ซ', '๐ก๏ธ', '๐ง', '๐ฉ', 'โ๏ธ', '๐๏ธ', 'โ๏ธ', '๐ฆฏ', '๐', 'โ๏ธ', '๐งฐ', '๐งฒ', 'โ๏ธ', '๐งช', '๐งซ', '๐งฌ', '๐ฌ', '๐ญ', '๐ก', '๐', '๐ฉธ', '๐', '๐ฉน', '๐ฉบ', '๐ช', '๐๏ธ', '๐๏ธ', '๐ช', '๐ฝ', '๐ฟ', '๐', '๐ช', '๐งด', '๐งท', '๐งน', '๐งบ', '๐งป', '๐งผ', '๐งฏ', '๐', '๐ฌ', 'โฐ๏ธ', 'โฑ๏ธ', '๐ฟ'],
|
||||
'Symbols': ['๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', 'โฃ๏ธ', '๐', 'โค๏ธ', '๐งก', '๐', '๐', '๐', '๐', '๐ค', '๐ค', '๐ค', '๐ฏ', '๐ข', '๐ฅ', '๐ซ', '๐ฆ', '๐จ', '๐ณ๏ธ', '๐ฃ', '๐ฌ', '๐๏ธโ๐จ๏ธ', '๐จ๏ธ', '๐ฏ๏ธ', '๐ญ', '๐ค', '๐', 'โ ๏ธ', 'โฅ๏ธ', 'โฆ๏ธ', 'โฃ๏ธ', '๐', '๐๏ธ', '๐ด', '๐ญ', '๐', '๐', '๐', '๐', '๐ข', '๐ฃ', '๐ฏ', '๐', '๐', '๐ผ', '๐ต', '๐ถ', '๐น', '๐ง', '๐ฎ', '๐ฐ', 'โฟ๏ธ', '๐น', '๐บ', '๐ป', '๐ผ', '๐พ', '๐', '๐', '๐', '๐
', 'โ ๏ธ', '๐ธ', 'โ๏ธ', '๐ซ', '๐ณ', '๐ญ', '๐ฏ', '๐ฑ', '๐ท', '๐ต', '๐', 'โข๏ธ', 'โฃ๏ธ', 'โฌ๏ธ', 'โ๏ธ', 'โก๏ธ', 'โ๏ธ', 'โฌ๏ธ', 'โ๏ธ', 'โฌ
๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โฉ๏ธ', 'โช๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', 'โ๏ธ', '๐๏ธ', 'โก๏ธ', 'โธ๏ธ', 'โฏ๏ธ', 'โ๏ธ', 'โฆ๏ธ', 'โช๏ธ', 'โฎ๏ธ', '๐', '๐ฏ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ', '๐', '๐', '๐', 'โถ๏ธ', 'โฉ', 'โญ๏ธ', 'โฏ๏ธ', 'โ๏ธ', 'โช', 'โฎ๏ธ', '๐ผ', 'โซ', '๐ฝ', 'โฌ', 'โธ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โ๏ธ', '๐ฆ', '๐
', '๐', '๐ถ', '๐ณ', '๐ด', 'โ', 'โ', 'โ', 'โ๏ธ', 'โพ๏ธ', 'โผ๏ธ', 'โ๏ธ', 'โ', 'โ', 'โ', 'โ๏ธ', 'ใฐ๏ธ', '๐ฑ', '๐ฒ', 'โ๏ธ', 'โป๏ธ', 'โ๏ธ', '๐ฑ', '๐', '๐ฐ', 'โญ๏ธ', 'โ
', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ', 'โ', 'โฐ', 'โฟ', 'ใฝ๏ธ', 'โณ๏ธ', 'โด๏ธ', 'โ๏ธ', 'โผ๏ธ', '๐', '๐๏ธ', '๐ท๏ธ', '๐ถ', '๐ฏ๏ธ', '๐', '๐น', '๐๏ธ', '๐ฒ', '๐', '๐ธ', '๐ด', '๐ณ', 'ใ๏ธ', 'ใ๏ธ', '๐บ', '๐ต', '๐ด', '๐ ', '๐ก', '๐ข', '๐ต', '๐ฃ', '๐ค', 'โซ๏ธ', 'โช๏ธ', '๐ฅ', '๐ง', '๐จ', '๐ฉ', '๐ฆ', '๐ช', '๐ซ', 'โฌ๏ธ', 'โฌ๏ธ'],
|
||||
'Flags': ['๐', '๐ฉ', '๐', '๐ด', '๐ณ๏ธ', '๐ณ๏ธโ๐', '๐ณ๏ธโโง๏ธ', '๐ดโโ ๏ธ', '๐ฆ๐ซ', '๐ฆ๐ฝ', '๐ฆ๐ฑ', '๐ฉ๐ฟ', '๐ฆ๐ฒ', '๐ฆ๐บ', '๐ฆ๐น', '๐ฆ๐ฟ', '๐ง๐ช', '๐ง๐ท', '๐จ๐ฆ', '๐จ๐ฑ', '๐จ๐ณ', '๐จ๐ด', '๐จ๐ฟ', '๐ฉ๐ฐ', '๐ช๐ฌ', '๐ซ๐ฎ', '๐ซ๐ท', '๐ฉ๐ช', '๐ฌ๐ท', '๐ญ๐ฐ', '๐ฎ๐ณ', '๐ฎ๐ฉ', '๐ฎ๐ช', '๐ฎ๐ฑ', '๐ฎ๐น', '๐ฏ๐ต', '๐ฐ๐ท', '๐ฒ๐ฝ', '๐ณ๐ฑ', '๐ณ๐ฟ', '๐ณ๐ด', '๐ต๐ฐ', '๐ต๐ญ', '๐ต๐ฑ', '๐ต๐น', '๐ท๐บ', '๐ธ๐ฆ', '๐ธ๐ฌ', '๐ฟ๐ฆ', '๐ช๐ธ', '๐ธ๐ช', '๐จ๐ญ', '๐น๐ญ', '๐น๐ท', '๐บ๐ฆ', '๐ฆ๐ช', '๐ฌ๐ง', '๐บ๐ธ', '๐ป๐ณ']
|
||||
'Smileys': ['๐', '๐', '๐', '๐', '๐', '๐
', '๐คฃ', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฅฐ', '๐', '๐คฉ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐คช', '๐', '๐ค', '๐ค', '๐คญ', '๐คซ', '๐ค', '๐ค', '๐คจ', '๐', '๐', '๐ถ', '๐', '๐', '๐', '๐ฌ', '๐คฅ', '๐', '๐', '๐ช', '๐คค', '๐ด', '๐ท', '๐ค', '๐ค', '๐คข', '๐คฎ', '๐คง', '๐ฅต', '๐ฅถ', '๐ฅด', '๐ต', '๐คฏ', '๐ค ', '๐ฅณ', '๐', '๐ค', '๐ง', '๐', '๐', '๐', 'โน๏ธ', '๐ฎ', '๐ฏ', '๐ฒ', '๐ณ', '๐ฅบ', '๐ฆ', '๐ง', '๐จ', '๐ฐ', '๐ฅ', '๐ข', '๐ญ', '๐ฑ', '๐', '๐ฃ', '๐', '๐', '๐ฉ', '๐ซ', '๐ฅฑ', '๐ค', '๐ก', '๐ ', '๐คฌ', '๐', '๐ฟ', '๐น', '๐บ', '๐', 'โ ๏ธ', '๐ฉ', '๐คก', '๐ป', '๐ฝ', '๐พ', '๐ค', '๐บ', '๐ธ', '๐ป', '๐ผ', '๐ฝ', '๐', '๐ฟ', '๐พ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', 'โฃ๏ธ', '๐', 'โค๏ธ', '๐งก', '๐', '๐', '๐', '๐', '๐ค', '๐ค', '๐ค', '๐ฏ', '๐ข', '๐ฅ', '๐ซ', '๐ฆ', '๐จ', '๐ณ๏ธ', '๐ฃ', '๐ฌ', '๐๏ธโ๐จ๏ธ', '๐จ๏ธ', '๐ฏ๏ธ', '๐ญ', '๐ค', '๐ช', '๐ ', '๐', '๐', '๐', '๐', '๐๏ธ', '๐', '๐'],
|
||||
'Gestures': ['๐', '๐ค', '๐๏ธ', 'โ', '๐', '๐', '๐ค', 'โ๏ธ', '๐ค', '๐ค', '๐ค', '๐ค', '๐', '๐', '๐', '๐', '๐', 'โ๏ธ', '๐', '๐', 'โ', '๐', '๐ค', '๐ค', '๐', '๐', '๐', '๐คฒ', '๐ค', '๐', 'โ๏ธ', '๐
', '๐คณ', '๐ช', '๐ฆพ', '๐ฆต', '๐ฆฟ', '๐ฆถ', '๐', '๐ฆป', '๐', '๐ง ', '๐ฆท', '๐ฆด', '๐', '๐๏ธ', '๐
', '๐', '๐', '๐ค', '๐ค', '๐๏ธ', '๐', '๐', 'โ๏ธ', '๐คณ', '๐ช', '๐ฆพ'],
|
||||
'People': ['๐ถ', '๐ง', '๐ฆ', '๐ง', '๐ง', '๐ฑ', '๐จ', '๐ฉ', '๐ง', '๐ด', '๐ต', '๐ฎ', '๐ต๏ธ', '๐', '๐ท', '๐คด', '๐ธ', '๐ณ', '๐ฒ', '๐ง', '๐คต', '๐ฐ', '๐คฐ', '๐คฑ', '๐ผ', '๐
', '๐คถ', '๐ฆธ', '๐ฆน', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐ง', '๐', '๐', '๐ถ', '๐', '๐', '๐บ', '๐ด๏ธ', '๐ฏ', '๐ง', '๐ง', '๐คบ', '๐', 'โท๏ธ', '๐', '๐๏ธ', '๐', '๐ฃ', '๐', 'โน๏ธ', '๐๏ธ', '๐ด', '๐ต', '๐คธ', '๐คผ', '๐คฝ', '๐คพ', '๐คน', '๐ง', '๐', '๐'],
|
||||
'Animals': ['๐ถ', '๐ฑ', '๐ญ', '๐น', '๐ฐ', '๐ฆ', '๐ป', '๐ผ', '๐จ', '๐ฏ', '๐ฆ', '๐ฎ', '๐ท', '๐ฝ', '๐ธ', '๐ต', '๐', '๐', '๐', '๐', '๐', '๐ง', '๐ฆ', '๐ค', '๐ฃ', '๐ฅ', '๐ฆ', '๐ฆ
', '๐ฆ', '๐ฆ', '๐บ', '๐', '๐ด', '๐ฆ', '๐', '๐', '๐ฆ', '๐', '๐', '๐', '๐ฆ', '๐ฆ', '๐ท๏ธ', '๐ธ๏ธ', '๐ฆ', '๐ข', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐ฆ', '๐ก', '๐ ', '๐', '๐ฌ', '๐ณ', '๐', '๐ฆ', '๐', '๐
', '๐', '๐ฆ', '๐ฆ', '๐ฆง', '๐', '๐ฆ', '๐ฆ', '๐ช', '๐ซ', '๐ฆ', '๐ฆ', '๐ฆฌ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฆ', '๐', '๐ฉ', '๐ฆฎ', '๐โ๐ฆบ', '๐', '๐โโฌ', '๐', '๐ฆ', '๐ฆ', '๐ฆ', '๐ฆข', '๐ฆฉ', '๐๏ธ', '๐', '๐ฆ', '๐ฆจ', '๐ฆก', '๐ฆฆ', '๐ฆฅ', '๐', '๐', '๐ฟ๏ธ', '๐ฆ', '๐พ', '๐', '๐ฒ', '๐ต', '๐', '๐ฒ', '๐ณ', '๐ด', '๐ฑ', '๐ฟ', 'โ๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐พ'],
|
||||
'Nature': ['๐', '๐ท', '๐น', '๐ฅ', '๐บ', '๐ธ', '๐ผ', '๐ป', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ช', '๐ซ', 'โญ๏ธ', '๐', 'โจ', 'โก๏ธ', 'โ๏ธ', '๐ฅ', '๐ฅ', '๐ช๏ธ', '๐', 'โ๏ธ', '๐ค๏ธ', 'โ
๏ธ', '๐ฅ๏ธ', 'โ๏ธ', '๐ฆ๏ธ', '๐ง๏ธ', '๐จ๏ธ', '๐ฉ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', '๐ฌ๏ธ', '๐จ', '๐ง', '๐ฆ', 'โ๏ธ', 'โ๏ธ', '๐', '๐ซ๏ธ', 'โฐ๏ธ', '๐๏ธ', '๐ป', '๐', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐๏ธ', 'โบ๏ธ'],
|
||||
'Food': ['๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฅญ', '๐', '๐ฅฅ', '๐ฅ', '๐
', '๐', '๐ฅ', '๐ฅฆ', '๐ฅฌ', '๐ฅ', '๐ฝ', '๐ฅ', '๐ง', '๐ง
', '๐', '๐ฅ', '๐ฐ', '๐', '๐ฅ', '๐ฅ', '๐ฅจ', '๐ฅฏ', '๐ฅ', '๐ง', '๐ง', '๐', '๐', '๐ฅฉ', '๐ฅ', '๐', '๐', '๐', '๐ญ', '๐ฅช', '๐ฎ', '๐ฏ', '๐ฅ', '๐ง', '๐ณ', '๐ฅ', '๐ฒ', '๐ฅฃ', '๐ฅ', '๐ฟ', '๐ง', '๐ง', '๐ฅซ', '๐ฑ', '๐', '๐', '๐', '๐', '๐', '๐', '๐ ', '๐ข', '๐ฃ', '๐ค', '๐ฅ', '๐ฅฎ', '๐ก', '๐ฅ', '๐ฅ ', '๐ฅก', '๐ฆ', '๐ง', '๐จ', '๐ฉ', '๐ช', '๐', '๐ฐ', '๐ง', '๐ฅง', '๐ซ', '๐ฌ', '๐ญ', '๐ฎ', '๐ฏ', '๐ผ', '๐ฅ', 'โ๏ธ', '๐ต', '๐ง', '๐ฅค', '๐ง', '๐บ', '๐ป', '๐ฅ', '๐ท', '๐ฅ', '๐ธ', '๐น', '๐พ', '๐ง', '๐ฅ', '๐ด', '๐ฝ๏ธ'],
|
||||
'Activities': ['โฝ๏ธ', '๐', '๐', 'โพ๏ธ', '๐ฅ', '๐พ', '๐', '๐', '๐ฑ', '๐', '๐ธ', '๐ฅ
', '๐', '๐', '๐', 'โณ๏ธ', '๐น', '๐ฃ', '๐ฅ', '๐ฅ', '๐น', '๐ท', 'โธ๏ธ', '๐ฅ', '๐ฟ', 'โท๏ธ', '๐', '๐๏ธ', '๐คบ', '๐คผ', '๐คธ', 'โน๏ธ', '๐คฝ', '๐คพ', '๐คน', '๐ง', '๐', '๐ฃ', '๐', '๐ด', '๐ต', '๐ง', '๐๏ธ', '๐', '๐
', '๐ฅ', '๐ฅ', '๐ฅ', '๐ซ', '๐๏ธ', '๐ญ', '๐จ', '๐ฌ', '๐ค', '๐ง', '๐ผ', '๐น', '๐ฅ', '๐ท', '๐บ', '๐ธ', '๐ช', '๐ป', '๐ฒ', 'โ๏ธ', '๐ฏ', '๐ณ', '๐ฎ', '๐ฐ', '๐งฉ'],
|
||||
'Travel': ['๐', '๐', '๐', '๐', '๐', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ต', '๐ฒ', '๐ด', '๐', '๐ฃ๏ธ', '๐ค๏ธ', 'โฝ๏ธ', '๐จ', '๐ฅ', '๐ฆ', '๐ง', 'โ๏ธ', 'โต๏ธ', '๐ค', '๐ณ๏ธ', 'โด๏ธ', '๐ข', 'โ๏ธ', '๐ซ', '๐ฌ', '๐บ', '๐', '๐', '๐ ', '๐ก', '๐', '๐ธ', '๐ฐ๏ธ', 'โ๏ธ', 'โณ', 'โ๏ธ', 'โฐ', 'โฑ๏ธ', 'โฒ๏ธ', '๐ฐ๏ธ', '๐ก๏ธ', '๐', '๐๏ธ', '๐', '๐
', '๐', '๐', '๐', '๐ ', '๐ก', '๐ข', '๐', '๐', '๐', '๐
', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐'],
|
||||
'Objects': ['โ๏ธ', '๐ฑ', '๐ฒ', '๐ป', 'โจ๏ธ', '๐ฑ๏ธ', '๐ฒ๏ธ', '๐น๏ธ', '๐๏ธ', '๐ฝ', '๐พ', '๐ฟ', '๐', '๐ผ', '๐ท', '๐ธ', '๐น', '๐ฅ', '๐ฝ๏ธ', '๐๏ธ', '๐', '๐ ', '๐บ', '๐ป', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐งญ', 'โฑ๏ธ', 'โฒ๏ธ', 'โฐ', '๐ฐ๏ธ', 'โ๏ธ', 'โณ', '๐ก', '๐', '๐', '๐ก', '๐ฆ', '๐ฏ๏ธ', '๐ช', '๐งฏ', '๐ข๏ธ', '๐ธ', '๐ต', '๐ด', '๐ถ', '๐ท', '๐ฐ', '๐ณ', '๐', 'โ๏ธ', '๐งฐ', '๐ง', '๐จ', 'โ๏ธ', '๐ ๏ธ', 'โ๏ธ', '๐ฉ', 'โ๏ธ', '๐งฑ', 'โ๏ธ', '๐งฒ', '๐ซ', '๐ฃ', '๐งจ', '๐ช', '๐ช', '๐ก๏ธ', 'โ๏ธ', '๐ก๏ธ', '๐ฌ', 'โฐ๏ธ', 'โฑ๏ธ', '๐บ', '๐ฎ', '๐งฟ', '๐ฟ', '๐', 'โ๏ธ', '๐ญ', '๐ฌ', '๐ณ๏ธ', '๐', '๐', '๐ฉธ', '๐งฌ', '๐ฆ ', '๐งซ', '๐งช', '๐ก๏ธ', '๐งน', '๐งบ', '๐งป', '๐งผ', '๐งฝ', '๐ช', '๐งด', '๐๏ธ', '๐', '๐๏ธ', '๐ช', '๐ช', '๐๏ธ', '๐๏ธ', '๐', '๐งธ', '๐ผ๏ธ', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐ฎ', '๐', '๐งง', 'โ๏ธ', '๐ฉ', '๐จ', '๐ง', '๐', '๐ฅ', '๐ค', '๐ฆ', '๐ท๏ธ', '๐', '๐', '๐
', '๐', '๐๏ธ', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐๏ธ', '๐', '๐', 'โ๏ธ', '๐๏ธ', '๐๏ธ', '๐๏ธ', '๐', '๐', '๐', '๐', '๐', '๐๏ธ'],
|
||||
'Symbols': ['๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', 'โฃ๏ธ', '๐', 'โค๏ธ', '๐งก', '๐', '๐', '๐', '๐', '๐ค', '๐ค', '๐ค', '๐ฏ', '๐ข', '๐ฅ', '๐ซ', '๐ฆ', '๐จ', '๐ณ๏ธ', '๐ฃ', '๐ฌ', '๐๏ธโ๐จ๏ธ', '๐จ๏ธ', '๐ฏ๏ธ', '๐ญ', '๐ค', '๐', 'โ ๏ธ', 'โฅ๏ธ', 'โฆ๏ธ', 'โฃ๏ธ', '๐', '๐๏ธ', '๐ด', '๐', '๐', '๐', '๐', '๐ข', '๐ฃ', '๐ฏ', '๐', '๐', '๐ผ', '๐ต', '๐ถ', '๐น', '๐ง', '๐ฎ', '๐ฐ', 'โฟ๏ธ', '๐น', '๐บ', '๐ป', '๐ผ', '๐พ', '๐', '๐', '๐', '๐
', 'โ ๏ธ', '๐ธ', 'โ๏ธ', '๐ซ', '๐ณ', '๐ญ', '๐ฏ', '๐ฑ', '๐ท', '๐ต', '๐', 'โข๏ธ', 'โฃ๏ธ', 'โฌ๏ธ', 'โ๏ธ', 'โก๏ธ', 'โ๏ธ', 'โฌ๏ธ', 'โ๏ธ', 'โฌ
๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โฉ๏ธ', 'โช๏ธ', 'โคด๏ธ', 'โคต๏ธ', '๐', '๐', '๐', '๐', '๐', '๐', '๐', '๐', 'โ๏ธ', '๐๏ธ', 'โก๏ธ', 'โธ๏ธ', 'โฏ๏ธ', 'โ๏ธ', 'โฆ๏ธ', 'โช๏ธ', 'โฎ๏ธ', '๐', '๐ฏ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ', '๐', '๐', '๐', 'โถ๏ธ', 'โฉ', 'โญ๏ธ', 'โฏ๏ธ', 'โ๏ธ', 'โช', 'โฎ๏ธ', '๐ผ', 'โซ', '๐ฝ', 'โฌ', 'โธ๏ธ', 'โน๏ธ', 'โบ๏ธ', 'โ๏ธ', '๐ฆ', '๐
', '๐', '๐ถ', '๐ณ', '๐ด', 'โ', 'โ', 'โ', 'โ๏ธ', 'โพ๏ธ', 'โผ๏ธ', 'โ๏ธ', 'โ', 'โ', 'โ', 'โ๏ธ', 'ใฐ๏ธ', '๐ฑ', '๐ฒ', 'โ๏ธ', 'โป๏ธ', 'โ๏ธ', '๐ฑ', '๐', '๐ฐ', 'โญ๏ธ', 'โ
', 'โ๏ธ', 'โ๏ธ', 'โ๏ธ', 'โ', 'โ', 'โฐ', 'โฟ', 'ใฝ๏ธ', 'โณ๏ธ', 'โด๏ธ', 'โ๏ธ', 'โผ๏ธ', '๐', '๐๏ธ', '๐ท๏ธ', '๐ถ', '๐ฏ๏ธ', '๐', '๐น', '๐๏ธ', '๐ฒ', '๐', '๐ธ', '๐ด', '๐ณ', 'ใ๏ธ', 'ใ๏ธ', '๐บ', '๐ต', '๐ด', '๐ ', '๐ก', '๐ข', '๐ต', '๐ฃ', '๐ค', 'โซ๏ธ', 'โช๏ธ', '๐ฅ', '๐ง', '๐จ', '๐ฉ', '๐ฆ', '๐ช', '๐ซ', 'โฌ๏ธ', 'โฌ๏ธ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โธ', 'โฆ', 'โฆ', 'โช', 'โฎ', 'โฏ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โพ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ', 'โ'],
|
||||
'Flags': ['๐', '๐ฉ', '๐', '๐ด', '๐ณ๏ธ', '๐ณ๏ธโ๐', '๐ณ๏ธโโง๏ธ', '๐ดโโ ๏ธ', '๐ฆ๐ซ', '๐ฆ๐ฝ', '๐ฆ๐ฑ', '๐ฉ๐ฟ', '๐ฆ๐ฒ', '๐ฆ๐บ', '๐ฆ๐น', '๐ฆ๐ฟ', '๐ง๐ช', '๐ง๐ท', '๐จ๐ฆ', '๐จ๐ฑ', '๐จ๐ณ', '๐จ๐ด', '๐จ๐ฟ', '๐ฉ๐ฐ', '๐ช๐ฌ', '๐ซ๐ฎ', '๐ซ๐ท', '๐ฉ๐ช', '๐ฌ๐ท', '๐ญ๐ฐ', '๐ฎ๐ณ', '๐ฎ๐ฉ', '๐ฎ๐ช', '๐ฎ๐ฑ', '๐ฎ๐น', '๐ฏ๐ต', '๐ฐ๐ท', '๐ฒ๐ฝ', '๐ณ๐ฑ', '๐ณ๐ฟ', '๐ณ๐ด', '๐ต๐ฐ', '๐ต๐ญ', '๐ต๐ฑ', '๐ต๐น', '๐ท๐บ', '๐ธ๐ฆ', '๐ธ๐ฌ', '๐ฟ๐ฆ', '๐ช๐ธ', '๐ธ๐ช', '๐จ๐ญ', '๐น๐ญ', '๐น๐ท', '๐บ๐ฆ', '๐ฆ๐ช', '๐ฌ๐ง', '๐บ๐ธ', '๐ป๐ณ', '๐ฆ๐ท', '๐ง๐ฉ', '๐ง๐ช', '๐ง๐ด', '๐ฎ๐ฉ', '๐ฎ๐ท', '๐ฎ๐ถ', '๐ฏ๐ฒ', '๐ฐ๐ฟ', '๐ฐ๐ช', '๐ฒ๐พ', '๐ฒ๐ฆ', '๐ณ๐ฌ', '๐ต๐ช', '๐ท๐ด', '๐ท๐ธ', '๐ธ๐ฐ', '๐บ๐พ', '๐ฟ๐ผ']
|
||||
};
|
||||
|
||||
// Global EMOJIS list for reactions (flattened)
|
||||
const EMOJIS = Object.values(EMOJI_CATEGORIES).flat();
|
||||
const ALL_EMOJIS = Object.values(EMOJI_CATEGORIES).flat();
|
||||
|
||||
function populateEmojiGrid(category = null, searchTerm = '') {
|
||||
const roleEmojiGrid = document.getElementById('role-emoji-grid');
|
||||
if (!roleEmojiGrid) return;
|
||||
|
||||
roleEmojiGrid.innerHTML = '';
|
||||
let emojis = [];
|
||||
|
||||
if (searchTerm) {
|
||||
emojis = EMOJIS.filter(e => e.includes(searchTerm) || searchTerm === '');
|
||||
// For simple search by name, we'd need names, but since we only have the emoji characters,
|
||||
// the user might search by the emoji itself or we could just show all if search is empty.
|
||||
// Actually, without a mapping of emoji to names, searching is limited.
|
||||
// But I'll implement it anyway so if they paste an emoji it works,
|
||||
// or I can add common names if I had a mapping.
|
||||
// Given the constraint, I'll just filter by character for now,
|
||||
// or maybe the user just wants a way to filter the massive list.
|
||||
} else {
|
||||
emojis = EMOJI_CATEGORIES[category] || [];
|
||||
}
|
||||
|
||||
emojis.forEach(emoji => {
|
||||
const span = document.createElement('span');
|
||||
span.textContent = emoji;
|
||||
span.style.cursor = 'pointer';
|
||||
span.style.fontSize = '20px';
|
||||
span.style.padding = '5px';
|
||||
span.style.textAlign = 'center';
|
||||
span.className = 'rounded role-emoji-item';
|
||||
span.onclick = () => {
|
||||
document.getElementById('edit-role-icon').value = emoji;
|
||||
document.getElementById('selected-role-emoji-preview').textContent = emoji;
|
||||
};
|
||||
roleEmojiGrid.appendChild(span);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Centralized Emoji Picker Component
|
||||
*/
|
||||
const UniversalEmojiPicker = {
|
||||
currentPicker: null,
|
||||
|
||||
function initEmojiCategories() {
|
||||
const categoriesContainer = document.getElementById('role-emoji-categories');
|
||||
const searchInput = document.getElementById('role-emoji-search');
|
||||
if (!categoriesContainer) return;
|
||||
|
||||
categoriesContainer.innerHTML = '';
|
||||
Object.keys(EMOJI_CATEGORIES).forEach((cat, index) => {
|
||||
const btn = document.createElement('button');
|
||||
btn.type = 'button';
|
||||
btn.className = 'btn btn-sm btn-dark text-nowrap px-2 py-1';
|
||||
btn.style.fontSize = '0.75em';
|
||||
btn.textContent = cat;
|
||||
if (index === 0) btn.classList.add('active', 'btn-primary');
|
||||
show(anchor, callback, options = {}) {
|
||||
this.hide();
|
||||
|
||||
btn.onclick = () => {
|
||||
if (searchInput) searchInput.value = '';
|
||||
categoriesContainer.querySelectorAll('button').forEach(b => b.classList.remove('active', 'btn-primary'));
|
||||
btn.classList.add('active', 'btn-primary');
|
||||
populateEmojiGrid(cat);
|
||||
};
|
||||
categoriesContainer.appendChild(btn);
|
||||
});
|
||||
const picker = document.createElement('div');
|
||||
picker.className = 'emoji-picker p-0 overflow-hidden d-flex flex-column';
|
||||
picker.style.width = options.width || '450px';
|
||||
picker.style.height = options.height || '450px';
|
||||
picker.style.backgroundColor = '#313338';
|
||||
picker.style.border = '1px solid #1e1f22';
|
||||
picker.style.borderRadius = '8px';
|
||||
picker.style.boxShadow = '0 8px 24px rgba(0,0,0,0.5)';
|
||||
picker.style.zIndex = '4000';
|
||||
picker.style.position = 'fixed';
|
||||
|
||||
// Tab Navigation
|
||||
const tabs = document.createElement('div');
|
||||
tabs.className = 'd-flex overflow-auto border-bottom border-secondary p-1 custom-scrollbar';
|
||||
tabs.style.gap = '2px';
|
||||
tabs.style.backgroundColor = '#2b2d31';
|
||||
|
||||
// Search Container
|
||||
const searchContainer = document.createElement('div');
|
||||
searchContainer.className = 'p-2 border-bottom border-secondary';
|
||||
searchContainer.style.backgroundColor = '#313338';
|
||||
|
||||
const searchInput = document.createElement('input');
|
||||
searchInput.type = 'text';
|
||||
searchInput.placeholder = 'Chercher un emoji...';
|
||||
searchInput.className = 'form-control form-control-sm bg-dark border-secondary text-white';
|
||||
searchContainer.appendChild(searchInput);
|
||||
|
||||
// Grid Container
|
||||
const grid = document.createElement('div');
|
||||
grid.className = 'flex-grow-1 overflow-auto p-2 custom-scrollbar';
|
||||
grid.style.display = 'grid';
|
||||
grid.style.gridTemplateColumns = 'repeat(8, 1fr)';
|
||||
grid.style.gap = '5px';
|
||||
grid.style.backgroundColor = '#313338';
|
||||
|
||||
const renderGrid = (cat = null, term = '') => {
|
||||
grid.innerHTML = '';
|
||||
let list = term ? ALL_EMOJIS.filter(e => e.includes(term)) : EMOJI_CATEGORIES[cat];
|
||||
|
||||
(list || []).forEach(emoji => {
|
||||
const span = document.createElement('span');
|
||||
span.textContent = emoji;
|
||||
span.className = 'emoji-item rounded d-flex align-items-center justify-content-center';
|
||||
span.style.cursor = 'pointer';
|
||||
span.style.fontSize = '24px';
|
||||
span.style.padding = '8px';
|
||||
span.style.aspectRatio = '1/1';
|
||||
|
||||
span.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
callback(emoji);
|
||||
if (!options.keepOpen) this.hide();
|
||||
};
|
||||
grid.appendChild(span);
|
||||
});
|
||||
};
|
||||
|
||||
// Init Tabs
|
||||
const categoryIcons = {
|
||||
'Smileys': '๐',
|
||||
'Gestures': '๐',
|
||||
'People': '๐ถ',
|
||||
'Animals': '๐ถ',
|
||||
'Nature': '๐ต',
|
||||
'Food': '๐',
|
||||
'Activities': 'โฝ๏ธ',
|
||||
'Travel': '๐',
|
||||
'Objects': 'โ๏ธ',
|
||||
'Symbols': 'โค๏ธ',
|
||||
'Flags': '๐'
|
||||
};
|
||||
|
||||
Object.keys(EMOJI_CATEGORIES).forEach((cat, idx) => {
|
||||
const btn = document.createElement('button');
|
||||
btn.className = `btn btn-sm text-nowrap px-2 py-2 border-0 ${idx === 0 ? 'btn-primary' : 'btn-dark'}`;
|
||||
btn.style.fontSize = '1.2em';
|
||||
btn.title = cat;
|
||||
btn.textContent = categoryIcons[cat] || 'โ';
|
||||
btn.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
searchInput.value = '';
|
||||
tabs.querySelectorAll('button').forEach(b => {
|
||||
b.classList.remove('btn-primary');
|
||||
b.classList.add('btn-dark');
|
||||
});
|
||||
btn.classList.add('btn-primary');
|
||||
btn.classList.remove('btn-dark');
|
||||
renderGrid(cat);
|
||||
};
|
||||
tabs.appendChild(btn);
|
||||
});
|
||||
btn.classList.add('btn-primary');
|
||||
btn.classList.remove('btn-dark');
|
||||
renderGrid(cat);
|
||||
};
|
||||
tabs.appendChild(btn);
|
||||
});
|
||||
|
||||
if (searchInput) {
|
||||
searchInput.oninput = () => {
|
||||
const term = searchInput.value.trim();
|
||||
if (term) {
|
||||
categoriesContainer.querySelectorAll('button').forEach(b => b.classList.remove('active', 'btn-primary'));
|
||||
populateEmojiGrid(null, term);
|
||||
tabs.querySelectorAll('button').forEach(b => b.classList.replace('btn-primary', 'btn-dark'));
|
||||
renderGrid(null, term);
|
||||
} else {
|
||||
const activeCat = categoriesContainer.querySelector('button.active')?.textContent || Object.keys(EMOJI_CATEGORIES)[0];
|
||||
populateEmojiGrid(activeCat);
|
||||
const activeCat = tabs.querySelector('button.btn-primary')?.textContent || Object.keys(EMOJI_CATEGORIES)[0];
|
||||
renderGrid(activeCat);
|
||||
}
|
||||
};
|
||||
|
||||
picker.appendChild(tabs);
|
||||
picker.appendChild(searchContainer);
|
||||
picker.appendChild(grid);
|
||||
document.body.appendChild(picker);
|
||||
this.currentPicker = picker;
|
||||
|
||||
// Positioning
|
||||
const rect = anchor.getBoundingClientRect();
|
||||
let top = rect.top - picker.offsetHeight - 10;
|
||||
if (top < 0) top = rect.bottom + 10;
|
||||
let left = rect.left;
|
||||
if (left + picker.offsetWidth > window.innerWidth) left = window.innerWidth - picker.offsetWidth - 20;
|
||||
if (left < 10) left = 10;
|
||||
|
||||
picker.style.top = `${top}px`;
|
||||
picker.style.left = `${left}px`;
|
||||
|
||||
renderGrid(Object.keys(EMOJI_CATEGORIES)[0]);
|
||||
|
||||
// Handle outside click
|
||||
const outsideClick = (e) => {
|
||||
if (!picker.contains(e.target) && e.target !== anchor && !anchor.contains(e.target)) {
|
||||
this.hide();
|
||||
document.removeEventListener('click', outsideClick);
|
||||
}
|
||||
};
|
||||
setTimeout(() => document.addEventListener('click', outsideClick), 10);
|
||||
},
|
||||
|
||||
hide() {
|
||||
if (this.currentPicker) {
|
||||
this.currentPicker.remove();
|
||||
this.currentPicker = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Initial load
|
||||
populateEmojiGrid(Object.keys(EMOJI_CATEGORIES)[0]);
|
||||
// Replace old showEmojiPicker and role grid logic
|
||||
window.showEmojiPicker = (anchor, callback) => UniversalEmojiPicker.show(anchor, callback, { width: '350px', height: '400px' });
|
||||
|
||||
// Update role editor emoji triggers
|
||||
function setupRoleEmojiTriggers() {
|
||||
const triggers = [
|
||||
{ btn: 'role-emoji-select-btn', target: 'edit-role-icon', preview: 'selected-role-emoji-preview' },
|
||||
{ btn: 'add-autorole-emoji-btn', target: 'add-autorole-icon', preview: 'add-autorole-emoji-preview' },
|
||||
{ btn: 'edit-autorole-emoji-btn', target: 'edit-autorole-icon', preview: 'edit-autorole-emoji-preview' }
|
||||
];
|
||||
|
||||
triggers.forEach(t => {
|
||||
const btn = document.getElementById(t.btn);
|
||||
if (btn) {
|
||||
btn.onclick = (e) => {
|
||||
e.preventDefault();
|
||||
UniversalEmojiPicker.show(btn, (emoji) => {
|
||||
const input = document.getElementById(t.target);
|
||||
const preview = document.getElementById(t.preview);
|
||||
if (input) input.value = emoji;
|
||||
if (preview) preview.textContent = emoji;
|
||||
}, { width: '350px', height: '400px' });
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// Chat Emoji Picker
|
||||
const chatEmojiBtn = document.getElementById('chat-emoji-btn');
|
||||
const chatInput = document.getElementById('chat-input');
|
||||
if (chatEmojiBtn && chatInput) {
|
||||
chatEmojiBtn.onclick = (e) => {
|
||||
e.preventDefault();
|
||||
UniversalEmojiPicker.show(chatEmojiBtn, (emoji) => {
|
||||
chatInput.value += emoji;
|
||||
chatInput.focus();
|
||||
}, { keepOpen: true, width: '350px', height: '400px' });
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Call init if elements exist
|
||||
if (document.getElementById('role-emoji-grid')) {
|
||||
initEmojiCategories();
|
||||
}
|
||||
// Call setup
|
||||
setupRoleEmojiTriggers();
|
||||
|
||||
// Scroll to bottom
|
||||
scrollToBottom(true);
|
||||
@ -332,12 +450,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
showEmojiPicker(addBtn, (emoji) => toggleReaction(msgId, emoji));
|
||||
return;
|
||||
}
|
||||
|
||||
// Close picker if click outside
|
||||
if (!e.target.closest('.emoji-picker')) {
|
||||
const picker = document.querySelector('.emoji-picker');
|
||||
if (picker) picker.remove();
|
||||
}
|
||||
});
|
||||
|
||||
async function toggleReaction(messageId, emoji) {
|
||||
@ -361,105 +473,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
} catch (e) { console.error(e); }
|
||||
}
|
||||
|
||||
function showEmojiPicker(anchor, callback) {
|
||||
document.querySelector('.emoji-picker')?.remove();
|
||||
const picker = document.createElement('div');
|
||||
picker.className = 'emoji-picker p-0 overflow-hidden d-flex flex-column';
|
||||
picker.style.width = '280px';
|
||||
picker.style.height = '320px';
|
||||
picker.style.backgroundColor = 'var(--bg-secondary)';
|
||||
picker.style.border = '1px solid var(--bg-tertiary)';
|
||||
picker.style.borderRadius = '8px';
|
||||
picker.style.boxShadow = '0 8px 24px rgba(0,0,0,0.5)';
|
||||
picker.style.zIndex = '2000';
|
||||
|
||||
const tabs = document.createElement('div');
|
||||
tabs.className = 'd-flex overflow-auto border-bottom border-secondary p-1 bg-dark';
|
||||
tabs.style.gap = '2px';
|
||||
|
||||
const searchContainer = document.createElement('div');
|
||||
searchContainer.className = 'p-2 border-bottom border-secondary';
|
||||
const searchInput = document.createElement('input');
|
||||
searchInput.type = 'text';
|
||||
searchInput.placeholder = 'Search emoji...';
|
||||
searchInput.className = 'form-control form-control-sm bg-dark border-secondary text-white';
|
||||
searchContainer.appendChild(searchInput);
|
||||
|
||||
const grid = document.createElement('div');
|
||||
grid.className = 'flex-grow-1 overflow-auto p-2';
|
||||
grid.style.display = 'grid';
|
||||
grid.style.gridTemplateColumns = 'repeat(7, 1fr)';
|
||||
grid.style.gap = '2px';
|
||||
|
||||
const renderGrid = (cat = null, term = '') => {
|
||||
grid.innerHTML = '';
|
||||
let emojis = [];
|
||||
if (term) {
|
||||
emojis = EMOJIS.filter(e => e.includes(term));
|
||||
} else {
|
||||
emojis = EMOJI_CATEGORIES[cat] || [];
|
||||
}
|
||||
|
||||
emojis.forEach(emoji => {
|
||||
const span = document.createElement('span');
|
||||
span.textContent = emoji;
|
||||
span.style.cursor = 'pointer';
|
||||
span.style.fontSize = '20px';
|
||||
span.style.padding = '5px';
|
||||
span.style.textAlign = 'center';
|
||||
span.className = 'rounded role-emoji-item';
|
||||
span.onclick = () => {
|
||||
callback(emoji);
|
||||
picker.remove();
|
||||
};
|
||||
grid.appendChild(span);
|
||||
});
|
||||
};
|
||||
|
||||
searchInput.oninput = () => {
|
||||
const term = searchInput.value.trim();
|
||||
if (term) {
|
||||
tabs.querySelectorAll('button').forEach(b => b.classList.remove('text-primary'));
|
||||
renderGrid(null, term);
|
||||
} else {
|
||||
const activeCat = tabs.querySelector('button.text-primary')?.textContent || Object.keys(EMOJI_CATEGORIES)[0];
|
||||
renderGrid(activeCat);
|
||||
}
|
||||
};
|
||||
|
||||
Object.keys(EMOJI_CATEGORIES).forEach((cat, index) => {
|
||||
const btn = document.createElement('button');
|
||||
btn.type = 'button';
|
||||
btn.className = 'btn btn-sm btn-dark text-nowrap px-2 py-1 border-0';
|
||||
btn.style.fontSize = '0.7em';
|
||||
btn.textContent = cat;
|
||||
if (index === 0) btn.classList.add('text-primary');
|
||||
|
||||
btn.onclick = (e) => {
|
||||
e.stopPropagation();
|
||||
searchInput.value = '';
|
||||
tabs.querySelectorAll('button').forEach(b => b.classList.remove('text-primary'));
|
||||
btn.classList.add('text-primary');
|
||||
renderGrid(cat);
|
||||
};
|
||||
tabs.appendChild(btn);
|
||||
});
|
||||
|
||||
picker.appendChild(tabs);
|
||||
picker.appendChild(searchContainer);
|
||||
picker.appendChild(grid);
|
||||
document.body.appendChild(picker);
|
||||
|
||||
renderGrid(Object.keys(EMOJI_CATEGORIES)[0]);
|
||||
|
||||
const rect = anchor.getBoundingClientRect();
|
||||
let top = rect.top - picker.offsetHeight - 5;
|
||||
if (top < 0) top = rect.bottom + 5;
|
||||
picker.style.position = 'fixed';
|
||||
picker.style.top = `${top}px`;
|
||||
picker.style.left = `${Math.min(rect.left, window.innerWidth - 300)}px`;
|
||||
}
|
||||
|
||||
function updateReactionUI(messageId, reactions) {
|
||||
const container = document.querySelector(`.message-reactions[data-message-id="${messageId}"]`);
|
||||
if (!container) return;
|
||||
@ -1027,19 +1040,23 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
modal.querySelector('#edit-channel-category-id').value = btn.dataset.category || '';
|
||||
modal.querySelector('#delete-channel-id').value = channelId;
|
||||
|
||||
// Check if channel is named "rรดle" or "role"
|
||||
const isRoleChannel = channelName.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") === "role";
|
||||
|
||||
// Toggle rules role visibility
|
||||
const rulesRoleContainer = document.getElementById('edit-channel-rules-role-container');
|
||||
if (rulesRoleContainer) {
|
||||
rulesRoleContainer.style.display = (channelType === 'rules') ? 'block' : 'none';
|
||||
}
|
||||
|
||||
// Hide limit, files and clear chat for rules
|
||||
// Hide limit, files and clear chat for rules, autorole, and role channels
|
||||
const editLimitContainer = document.getElementById('edit-channel-limit-container');
|
||||
const editFilesContainer = document.getElementById('edit-channel-files-container');
|
||||
const clearChatBtn = document.getElementById('clear-channel-history-btn');
|
||||
|
||||
if (editLimitContainer) editLimitContainer.style.display = (channelType === 'rules') ? 'none' : 'block';
|
||||
if (editFilesContainer) editFilesContainer.style.display = (channelType === 'rules') ? 'none' : 'block';
|
||||
const hideExtra = (channelType === 'rules' || channelType === 'autorole' || isRoleChannel);
|
||||
if (editLimitContainer) editLimitContainer.style.display = hideExtra ? 'none' : 'block';
|
||||
if (editFilesContainer) editFilesContainer.style.display = hideExtra ? 'none' : 'block';
|
||||
if (clearChatBtn) clearChatBtn.style.display = (channelType === 'rules') ? 'none' : 'inline-block';
|
||||
|
||||
// Reset delete zone
|
||||
@ -1078,6 +1095,8 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
const type = editChannelType.value;
|
||||
const rssTabNav = document.getElementById('rss-tab-nav');
|
||||
const statusContainer = document.getElementById('edit-channel-status-container');
|
||||
const channelName = document.getElementById('edit-channel-name').value;
|
||||
const isRoleChannel = channelName.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") === "role";
|
||||
|
||||
rssTabNav.style.display = (type === 'announcement') ? 'block' : 'none';
|
||||
statusContainer.style.display = (type === 'voice') ? 'block' : 'none';
|
||||
@ -1092,9 +1111,10 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
const editFilesContainer = document.getElementById('edit-channel-files-container');
|
||||
const clearChatBtn = document.getElementById('clear-channel-history-btn');
|
||||
|
||||
if (editLimitContainer) editLimitContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
|
||||
if (editFilesContainer) editFilesContainer.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'block';
|
||||
if (clearChatBtn) clearChatBtn.style.display = (type === 'rules' || type === 'autorole') ? 'none' : 'inline-block';
|
||||
const hideExtra = (type === 'rules' || type === 'autorole' || isRoleChannel);
|
||||
if (editLimitContainer) editLimitContainer.style.display = hideExtra ? 'none' : 'block';
|
||||
if (editFilesContainer) editFilesContainer.style.display = hideExtra ? 'none' : 'block';
|
||||
if (clearChatBtn) clearChatBtn.style.display = (type === 'rules') ? 'none' : 'inline-block';
|
||||
});
|
||||
|
||||
// RSS Management
|
||||
@ -2346,6 +2366,10 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
document.getElementById('edit-autorole-icon').value = icon;
|
||||
document.getElementById('edit-autorole-title').value = title;
|
||||
document.getElementById('edit-autorole-role-id').value = roleId;
|
||||
|
||||
// Update preview
|
||||
const preview = document.getElementById('edit-autorole-emoji-preview');
|
||||
if (preview) preview.textContent = icon;
|
||||
});
|
||||
|
||||
// Universal Emoji Picker Trigger
|
||||
|
||||
31
index.php
31
index.php
@ -915,6 +915,9 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<input type="text" id="chat-input" class="chat-input" placeholder="Message #<?php echo htmlspecialchars($current_channel_name); ?>" autocomplete="off">
|
||||
<button type="button" class="btn border-0 text-muted p-2" id="chat-emoji-btn" title="Emoji Picker">
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M8 14s1.5 2 4 2 4-2 4-2"></path><line x1="9" y1="9" x2="9.01" y2="9"></line><line x1="15" y1="9" x2="15.01" y2="9"></line></svg>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
@ -1275,7 +1278,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
|
||||
<!-- Add Autorole Modal -->
|
||||
<div class="modal fade" id="addAutoroleModal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Ajouter un Autorole</h5>
|
||||
@ -1289,8 +1292,9 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
<div class="mb-3">
|
||||
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Icรดne (Emoji)</label>
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<input type="text" name="icon" id="add-autorole-icon" class="form-control" style="width: 60px; text-align: center; font-size: 1.5em;" placeholder="๐" required readonly>
|
||||
<button type="button" class="btn btn-outline-secondary ms-2 open-emoji-picker" data-target="#add-autorole-icon">Choisir...</button>
|
||||
<div id="add-autorole-emoji-preview" class="d-flex align-items-center justify-content-center border rounded me-2" style="width: 48px; height: 48px; font-size: 24px; background: #1e1f22;">๐</div>
|
||||
<input type="hidden" name="icon" id="add-autorole-icon" value="๐">
|
||||
<button type="button" class="btn btn-outline-secondary" id="add-autorole-emoji-btn">Choisir un emoji...</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
@ -1318,7 +1322,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
|
||||
<!-- Edit Autorole Modal -->
|
||||
<div class="modal fade" id="editAutoroleModal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Modifier l'Autorole</h5>
|
||||
@ -1333,8 +1337,9 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
<div class="mb-3">
|
||||
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Icรดne (Emoji)</label>
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<input type="text" name="icon" id="edit-autorole-icon" class="form-control" style="width: 60px; text-align: center; font-size: 1.5em;" required readonly>
|
||||
<button type="button" class="btn btn-outline-secondary ms-2 open-emoji-picker" data-target="#edit-autorole-icon">Modifier...</button>
|
||||
<div id="edit-autorole-emoji-preview" class="d-flex align-items-center justify-content-center border rounded me-2" style="width: 48px; height: 48px; font-size: 24px; background: #1e1f22;"></div>
|
||||
<input type="hidden" name="icon" id="edit-autorole-icon">
|
||||
<button type="button" class="btn btn-outline-secondary" id="edit-autorole-emoji-btn">Changer l'emoji...</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
@ -1605,7 +1610,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
|
||||
<!-- Role Editor Modal -->
|
||||
<div class="modal fade" id="roleEditorModal" tabindex="-1">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Edit Role</h5>
|
||||
@ -1624,19 +1629,11 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
|
||||
<div class="mb-3">
|
||||
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Role Icon</label>
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<div id="selected-role-emoji-preview" class="d-flex align-items-center justify-content-center border rounded" style="width: 40px; height: 40px; font-size: 24px; background: rgba(0,0,0,0.2);"></div>
|
||||
<div id="selected-role-emoji-preview" class="d-flex align-items-center justify-content-center border rounded" style="width: 48px; height: 48px; font-size: 24px; background: #1e1f22;"></div>
|
||||
<input type="hidden" id="edit-role-icon">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary ms-2" id="role-emoji-select-btn">Choisir un Emoji</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-danger ms-2" onclick="document.getElementById('edit-role-icon').value=''; document.getElementById('selected-role-emoji-preview').textContent='';">Remove Icon</button>
|
||||
</div>
|
||||
<div id="role-emoji-categories" class="d-flex overflow-auto mb-2 p-1" style="background: rgba(0,0,0,0.1); border-radius: 4px; gap: 5px;">
|
||||
<!-- Categories populated by JS -->
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<input type="text" id="role-emoji-search" class="form-control form-control-sm bg-dark border-secondary text-white" placeholder="Search emoji...">
|
||||
</div>
|
||||
<div id="role-emoji-grid" class="border rounded p-2" style="max-height: 150px; overflow-y: auto; display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; background: rgba(0,0,0,0.2);">
|
||||
<!-- Emojis populated by JS -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label text-uppercase fw-bold" style="font-size: 0.7em; color: var(--text-muted);">Permissions</label>
|
||||
|
||||
44
requests.log
44
requests.log
@ -165,3 +165,47 @@
|
||||
2026-02-16 03:21:33 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:21:35 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:21:38 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:26:28 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 03:26:35 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:28:36 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:30:31 - GET /index.php?server_id=1&channel_id=12 - POST: []
|
||||
2026-02-16 03:30:36 - GET /index.php?server_id=1&channel_id=11 - POST: []
|
||||
2026-02-16 03:30:41 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:32:55 - GET / - POST: []
|
||||
2026-02-16 03:32:59 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:33:09 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:33:11 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 03:33:12 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:33:14 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:33:34 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:33:37 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 03:35:52 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 08:35:40 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 08:37:05 - GET /index.php?server_id=1&channel_id=6 - POST: []
|
||||
2026-02-16 08:54:29 - GET / - POST: []
|
||||
2026-02-16 08:54:39 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:42:27 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:47:00 - GET /index.php?server_id=1&channel_id=6 - POST: []
|
||||
2026-02-16 12:47:29 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 12:47:34 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 12:48:16 - GET / - POST: []
|
||||
2026-02-16 12:48:18 - HEAD / - POST: []
|
||||
2026-02-16 12:48:24 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:48:45 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:51:34 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:53:59 - GET / - POST: []
|
||||
2026-02-16 12:54:11 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 12:54:33 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 12:54:52 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 12:56:37 - GET /index.php?server_id=1&channel_id=11 - POST: []
|
||||
2026-02-16 12:56:38 - GET /index.php?server_id=1&channel_id=12 - POST: []
|
||||
2026-02-16 13:01:21 - GET / - POST: []
|
||||
2026-02-16 13:01:28 - GET /?fl_project=38443 - POST: []
|
||||
2026-02-16 13:03:56 - GET /index.php?server_id=1&channel_id=12 - POST: []
|
||||
2026-02-16 13:06:06 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 13:06:15 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 13:06:20 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
2026-02-16 13:06:25 - GET /index.php?server_id=1&channel_id=1 - POST: []
|
||||
2026-02-16 13:06:41 - GET /index.php?server_id=1&channel_id=1 - POST: []
|
||||
2026-02-16 13:06:43 - GET /index.php?server_id=1&channel_id=1 - POST: []
|
||||
2026-02-16 13:06:45 - GET /index.php?server_id=1&channel_id=17 - POST: []
|
||||
|
||||
Loadingโฆ
x
Reference in New Issue
Block a user