koishi-plugin-chat-patch 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/vue/style.css +32 -2
- package/dist/style.css +1 -1
- package/lib/api-handlers.d.ts +17 -0
- package/lib/file-manager.d.ts +18 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.js +144 -146
- package/lib/message-handler.d.ts +16 -0
- package/package.json +1 -1
- package/src/api-handlers.ts +2 -1
- package/src/file-manager.ts +4 -3
- package/src/index.ts +5 -5
- package/src/message-handler.ts +2 -2
package/client/vue/style.css
CHANGED
|
@@ -65,6 +65,9 @@
|
|
|
65
65
|
color: #7276b7;
|
|
66
66
|
line-height: 1.3;
|
|
67
67
|
word-wrap: break-word;
|
|
68
|
+
word-break: break-all;
|
|
69
|
+
overflow-wrap: anywhere;
|
|
70
|
+
hyphens: auto;
|
|
68
71
|
}
|
|
69
72
|
|
|
70
73
|
.quote-content .message-image {
|
|
@@ -422,6 +425,9 @@
|
|
|
422
425
|
display: inline-block;
|
|
423
426
|
max-width: 80%;
|
|
424
427
|
text-align: left;
|
|
428
|
+
word-wrap: break-word;
|
|
429
|
+
word-break: break-all;
|
|
430
|
+
overflow-wrap: anywhere;
|
|
425
431
|
}
|
|
426
432
|
|
|
427
433
|
@keyframes highlight {
|
|
@@ -486,10 +492,11 @@
|
|
|
486
492
|
color: currentColor;
|
|
487
493
|
line-height: 1.4;
|
|
488
494
|
word-wrap: break-word;
|
|
489
|
-
word-break: break-
|
|
495
|
+
word-break: break-all;
|
|
490
496
|
white-space: pre-wrap;
|
|
491
497
|
max-width: 100%;
|
|
492
|
-
overflow-wrap:
|
|
498
|
+
overflow-wrap: anywhere;
|
|
499
|
+
hyphens: auto;
|
|
493
500
|
}
|
|
494
501
|
|
|
495
502
|
.message-item:not(.bot-message) .message-text {
|
|
@@ -499,6 +506,9 @@
|
|
|
499
506
|
border-bottom-left-radius: 4px;
|
|
500
507
|
display: inline-block;
|
|
501
508
|
max-width: 80%;
|
|
509
|
+
word-wrap: break-word;
|
|
510
|
+
word-break: break-all;
|
|
511
|
+
overflow-wrap: anywhere;
|
|
502
512
|
}
|
|
503
513
|
|
|
504
514
|
.message-input {
|
|
@@ -641,6 +651,10 @@
|
|
|
641
651
|
|
|
642
652
|
.message-text-content {
|
|
643
653
|
display: inline;
|
|
654
|
+
word-wrap: break-word;
|
|
655
|
+
word-break: break-all;
|
|
656
|
+
overflow-wrap: anywhere;
|
|
657
|
+
hyphens: auto;
|
|
644
658
|
}
|
|
645
659
|
|
|
646
660
|
.message-paragraph {
|
|
@@ -683,6 +697,9 @@
|
|
|
683
697
|
font-size: 13px;
|
|
684
698
|
margin: 2px 0;
|
|
685
699
|
line-height: 1.4;
|
|
700
|
+
word-wrap: break-word;
|
|
701
|
+
word-break: break-all;
|
|
702
|
+
overflow-wrap: anywhere;
|
|
686
703
|
}
|
|
687
704
|
|
|
688
705
|
.forward-message-footer {
|
|
@@ -742,6 +759,9 @@
|
|
|
742
759
|
color: #555;
|
|
743
760
|
font-size: 13px;
|
|
744
761
|
line-height: 1.4;
|
|
762
|
+
word-wrap: break-word;
|
|
763
|
+
word-break: break-all;
|
|
764
|
+
overflow-wrap: anywhere;
|
|
745
765
|
}
|
|
746
766
|
|
|
747
767
|
.message-at {
|
|
@@ -839,6 +859,10 @@
|
|
|
839
859
|
|
|
840
860
|
.message-text-content {
|
|
841
861
|
display: inline;
|
|
862
|
+
word-wrap: break-word;
|
|
863
|
+
word-break: break-all;
|
|
864
|
+
overflow-wrap: anywhere;
|
|
865
|
+
hyphens: auto;
|
|
842
866
|
}
|
|
843
867
|
|
|
844
868
|
.message-image-container {
|
|
@@ -1241,6 +1265,8 @@ body.dragging-bubble-global {
|
|
|
1241
1265
|
opacity: .8;
|
|
1242
1266
|
white-space: pre-wrap;
|
|
1243
1267
|
word-wrap: break-word;
|
|
1268
|
+
word-break: break-all;
|
|
1269
|
+
overflow-wrap: anywhere;
|
|
1244
1270
|
max-height: 200px;
|
|
1245
1271
|
overflow-y: auto;
|
|
1246
1272
|
border: 1px solid rgba(128, 128, 128, .2);
|
|
@@ -1376,6 +1402,10 @@ body.dragging-bubble-global {
|
|
|
1376
1402
|
padding: 6px;
|
|
1377
1403
|
}
|
|
1378
1404
|
|
|
1405
|
+
.message-text {
|
|
1406
|
+
max-width: 90% !important;
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1379
1409
|
.message-avatar {
|
|
1380
1410
|
width: 28px;
|
|
1381
1411
|
height: 28px;
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.message-quote[data-v-323dce07]{margin:8px 0;padding:8px 12px;background-color:#bebebe1a;border-left:4px solid rgba(151,152,152,.45);border-radius:6px;font-size:.9em;position:relative}.quote-indicator[data-v-323dce07]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-323dce07]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-323dce07]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#6c757d;color:#fff;font-size:10px;font-weight:700}.quote-username[data-v-323dce07]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-323dce07]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-323dce07]{color:#7276b7;line-height:1.3;word-wrap:break-word}.quote-content .message-image[data-v-323dce07]{max-width:200px;max-height:100px}.quote-content .message-image-container[data-v-323dce07]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-323dce07]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-323dce07]{color:#adb5bd}.quote-username[data-v-323dce07]{color:#0d6efd}}.chat-container[data-v-323dce07]{display:flex;height:100vh;background:transparent;margin-left:0%;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{display:flex;flex-direction:column;background:transparent;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-323dce07]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-323dce07]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-323dce07]{flex:1;border-right:none}.panel-header[data-v-323dce07]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:transparent;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-323dce07]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-323dce07]{display:none;background:none;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-323dce07]:hover{background:#8080801a}.bot-items[data-v-323dce07],.channel-items[data-v-323dce07]{flex:1;overflow-y:auto;max-height:calc(100vh - 60px)}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{display:flex;align-items:center;padding:12px 16px;cursor:pointer;border-bottom:1px solid rgba(128,128,128,.1);transition:background-color .2s}.bot-item[data-v-323dce07]:hover,.channel-item[data-v-323dce07]:hover{background:#8080801a}.bot-item.active[data-v-323dce07],.channel-item.active[data-v-323dce07]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-323dce07]{width:40px;height:40px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0}.bot-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-323dce07]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-323dce07]{flex:1}.bot-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-323dce07]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-323dce07]{background:#4caf50}.bot-status.offline[data-v-323dce07]{background:#f44336}.channel-info[data-v-323dce07]{flex:1}.channel-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-323dce07]{background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;position:relative;transition:all .2s ease}.channel-message-count.draggable-bubble[data-v-323dce07]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble[data-v-323dce07]:active,.channel-message-count.draggable-bubble.dragging[data-v-323dce07]{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-323dce07]{position:fixed;z-index:1000;pointer-events:none;transition:none;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;box-shadow:0 4px 12px #2196f366}.dragging-clone.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes pulseThreshold-323dce07{0%,to{opacity:.4;transform:scale(.9);border-color:#f4433699;box-shadow:0 0 15px #f4433633}50%{opacity:.8;transform:scale(1.1);border-color:#f44336;box-shadow:0 0 25px #f4433666}}@keyframes menuSlideIn-323dce07{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-323dce07]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-323dce07]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-323dce07]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-323dce07]:hover{background-color:#8080801a}.message-item.new-message[data-v-323dce07]{background-color:#4caf5033;animation:highlight-323dce07 2s ease-out}.message-item.bot-message[data-v-323dce07]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-323dce07]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-323dce07]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-323dce07]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-323dce07]{order:1}.message-item.bot-message .message-text[data-v-323dce07]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left}@keyframes highlight-323dce07{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-323dce07]{width:32px;height:32px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0;flex-shrink:0}.message-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-323dce07]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-323dce07]{flex:1}.message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-323dce07]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-323dce07]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-word;white-space:pre-wrap;max-width:100%;overflow-wrap:break-word}.message-item:not(.bot-message) .message-text[data-v-323dce07]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%}.message-input[data-v-323dce07]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:transparent;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-323dce07]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-323dce07]{position:absolute;right:24px;bottom:18%;width:48px;height:48px;background:#2196f3;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #2196f34d;color:#fff;transition:all .3s ease;z-index:100;border:2px solid rgba(255,255,255,.2)}.floating-scroll-button[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-323dce07]:active{transform:scale(.95)}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-323dce07]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-323dce07]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease}.message-image-loading[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#f443361a;border:1px solid rgba(244,67,54,.3);border-radius:4px;color:#f44336;font-size:12px;max-width:300px;word-break:break-word}.message-paragraph[data-v-323dce07]{display:block;margin-bottom:4px}.message-paragraph[data-v-323dce07]:last-child{margin-bottom:0}.forward-message-container[data-v-323dce07]{border:1px solid #ffffff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-323dce07]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-323dce07]:hover{background:#f0f0f0}.forward-message-title[data-v-323dce07]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-323dce07]{color:#666;font-size:13px;margin:2px 0;line-height:1.4}.forward-message-footer[data-v-323dce07]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-323dce07]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-323dce07]{color:#666;font-size:12px}.forward-message-expanded[data-v-323dce07]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-323dce07]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-323dce07]:last-child{border-bottom:none}.forwarded-message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-323dce07]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-323dce07]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-323dce07]{color:#555;font-size:13px;line-height:1.4}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-323dce07]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:none;background:transparent;color:currentColor}.input-row input[data-v-323dce07]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-323dce07]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;flex-shrink:0;white-space:nowrap}.input-row button[data-v-323dce07]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-323dce07]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-323dce07]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-323dce07]{display:inline}.message-image-container[data-v-323dce07]{display:block;margin:4px 0}.message-image[data-v-323dce07]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-323dce07]:hover{transform:scale(1.02)}.message-image-loading[data-v-323dce07]{height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3)}.message-image-error[data-v-323dce07]{min-height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3);padding:8px;text-align:center}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 6px;border-radius:4px;font-weight:500;cursor:pointer;display:inline-block;margin:0 2px}.message-at[data-v-323dce07]:hover{background:#2196f333}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-323dce07{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes shake-323dce07{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-323dce07]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-323dce07]{position:fixed;pointer-events:none;border:3px dashed rgba(244,67,54,.8);border-radius:50%;z-index:999;background:#f443361a;box-shadow:0 0 20px #f443364d;animation:pulseThreshold-323dce07 1.5s ease-in-out infinite}.context-menu[data-v-323dce07]{position:fixed;background:#ffffffa6;border:1px solid rgba(0,0,0,.1);border-radius:8px;box-shadow:0 8px 32px #00000026;z-index:10000;min-width:180px;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);overflow:hidden}.context-menu-item[data-v-323dce07]{padding:12px 16px;cursor:pointer;color:#333;font-size:14px;font-weight:500;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.08);position:relative}.context-menu-item[data-v-323dce07]:last-child{border-bottom:none}.context-menu-item[data-v-323dce07]:hover{background:#2196f31a;color:#1976d2;transform:translate(2px)}.context-menu-item.danger[data-v-323dce07]{color:#d32f2f}.context-menu-item.danger[data-v-323dce07]:hover{background:#f443361a;color:#c62828}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-323dce07]:before,.channel-item.pinned[data-v-323dce07]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-323dce07]{background:#ffffff26;border-color:#fff3;box-shadow:0 8px 32px #0006}.context-menu-item[data-v-323dce07]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-323dce07]:hover{background:#2196f333;color:#64b5f6}.context-menu-item.danger[data-v-323dce07]{color:#ff8a80}.context-menu-item.danger[data-v-323dce07]:hover{background:#f4433633;color:#ffab91}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc10726}}.message-share-card[data-v-323dce07]{display:inline-block;width:75px;margin:8px 0;border:1px solid rgba(128,128,128,.2);border-radius:12px;background:#ffffff0d;transition:all .3s ease;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.message-share-card[data-v-323dce07]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-323dce07]{width:100%;position:relative;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:12px 12px 0 0}.share-card-image[data-v-323dce07]{max-width:calc(100% - 8px);width:auto;height:auto;object-fit:contain;transition:transform .3s ease;display:block;border-radius:4px}.message-share-card:hover .share-card-image[data-v-323dce07]{transform:scale(1.05)}.share-card-content[data-v-323dce07]{padding:8px}.share-card-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-323dce07]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-323dce07]{flex:1;min-width:0}.share-card-app-name[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-323dce07]{font-size:10px;font-weight:600;color:currentColor;line-height:1.2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.share-card-desc[data-v-323dce07]{font-size:14px;color:currentColor;opacity:.8;line-height:1.4;margin-bottom:12px;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.share-card-link-hint[data-v-323dce07]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-323dce07]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-323dce07]:after{transform:translate(2px)}.message-json-error[data-v-323dce07],.message-json-raw[data-v-323dce07]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-323dce07]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-323dce07]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-323dce07]{margin-top:8px}.json-raw-data summary[data-v-323dce07]{cursor:pointer;font-size:12px;color:#2196f3;font-weight:500;padding:4px 8px;border-radius:4px;background:#2196f31a;display:inline-block;transition:background-color .2s ease}.json-raw-data summary[data-v-323dce07]:hover{background:#2196f333}.json-raw-content[data-v-323dce07]{margin-top:8px;padding:12px;background:#8080801a;border-radius:8px;font-family:Courier New,monospace;font-size:12px;color:currentColor;opacity:.8;white-space:pre-wrap;word-wrap:break-word;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-323dce07]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-323dce07]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-323dce07]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-323dce07]{position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-323dce07]{transform:translate(0);z-index:3}.channel-list[data-v-323dce07]{transform:translate(100%);z-index:2}.message-area[data-v-323dce07]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-323dce07]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-323dce07]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-323dce07]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-323dce07]{transform:translate(0);z-index:3}.back-button[data-v-323dce07]{display:none!important}.panel-header[data-v-323dce07]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-323dce07]{text-align:right}.floating-scroll-button[data-v-323dce07]{right:16px;bottom:70px;width:40px;height:40px}.message-input[data-v-323dce07]{padding:8px 12px 12px;position:fixed;bottom:0;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10}.input-row input[data-v-323dce07]{font-size:16px;padding:10px 12px}.input-row button[data-v-323dce07]{padding:10px 16px;font-size:16px}.message-history[data-v-323dce07]{padding:12px 12px 80px;max-height:calc(100vh - 140px)}.message-item[data-v-323dce07]{margin-bottom:12px;padding:6px}.message-avatar[data-v-323dce07]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-left:8px}.message-image[data-v-323dce07]{max-width:280px;max-height:160px}.quote-content .message-image[data-v-323dce07]{max-width:150px;max-height:80px}.context-menu[data-v-323dce07]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-323dce07]{padding:14px 16px;font-size:16px}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{padding:14px 16px}.bot-avatar[data-v-323dce07]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-323dce07],.channel-name[data-v-323dce07]{font-size:15px}.bot-platform[data-v-323dce07],.channel-type[data-v-323dce07]{font-size:13px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-323dce07]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-323dce07]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-323dce07]{max-width:350px;max-height:180px}}.chat-container.swiping[data-v-323dce07]{overflow:hidden}.bot-list.swiping[data-v-323dce07],.channel-list.swiping[data-v-323dce07],.message-area.swiping[data-v-323dce07]{transition:none!important}.swipe-indicator[data-v-323dce07]{position:fixed;top:50%;left:20px;transform:translateY(-50%);background:#2196f3cc;color:#fff;padding:8px 12px;border-radius:20px;font-size:14px;z-index:1000;opacity:0;transition:opacity .2s ease;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.swipe-indicator.show[data-v-323dce07]{opacity:1}.message-area .message-content[data-v-323dce07]{padding-bottom:80px}.image-preview-container[data-v-323dce07]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-323dce07]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-323dce07]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-323dce07]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-323dce07]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-323dce07]{position:relative;margin-right:8px}.add-button[data-v-323dce07]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-323dce07]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-323dce07]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-323dce07]:hover:before{opacity:1}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#f093fb,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-323dce07]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-323dce07]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-323dce07 .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-323dce07]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:none;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-323dce07]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#667eea14,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-323dce07]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-323dce07]{flex-shrink:0}@media (prefers-color-scheme: dark){.action-menu[data-v-323dce07]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-323dce07]{color:#fff}.action-menu-item[data-v-323dce07]:before{background:linear-gradient(135deg,#4facfe,#00f2fe)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#4facfe1f,#00f2fe1f);color:#4facfe}.add-button[data-v-323dce07]{background:linear-gradient(135deg,#4facfe,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-323dce07]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#fa709a,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-323dce07]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width: 768px){.image-preview-container[data-v-323dce07]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-323dce07]{width:50px;height:50px}.add-button[data-v-323dce07]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-323dce07]{min-width:100px}.action-menu-item[data-v-323dce07]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-323dce07]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-323dce07]::-webkit-scrollbar{width:6px}.message-history[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.bot-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.channel-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.channel-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-323dce07]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme: dark){.message-history[data-v-323dce07]::-webkit-scrollbar-thumb,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#fff3}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#fff6}}.layout-iframe{width:100%;height:100%;border:none}
|
|
1
|
+
.message-quote[data-v-323dce07]{margin:8px 0;padding:8px 12px;background-color:#bebebe1a;border-left:4px solid rgba(151,152,152,.45);border-radius:6px;font-size:.9em;position:relative}.quote-indicator[data-v-323dce07]{font-size:.75em;color:#007bff;font-weight:600;margin-bottom:4px;text-transform:uppercase}.quote-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px;gap:6px}.quote-avatar[data-v-323dce07]{width:20px;height:20px;border-radius:50%;overflow:hidden;flex-shrink:0}.quote-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.quote-avatar .avatar-placeholder[data-v-323dce07]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:#6c757d;color:#fff;font-size:10px;font-weight:700}.quote-username[data-v-323dce07]{font-weight:600;color:#007bff;font-size:.85em}.quote-time[data-v-323dce07]{color:#6c757d;font-size:.75em;margin-left:auto}.quote-content[data-v-323dce07]{color:#7276b7;line-height:1.3;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.quote-content .message-image[data-v-323dce07]{max-width:200px;max-height:100px}.quote-content .message-image-container[data-v-323dce07]{margin:2px 0}@media (prefers-color-scheme: dark){.message-quote[data-v-323dce07]{background-color:#ffffff14;border-left-color:#0d6efd}.quote-content[data-v-323dce07]{color:#adb5bd}.quote-username[data-v-323dce07]{color:#0d6efd}}.chat-container[data-v-323dce07]{display:flex;height:100vh;background:transparent;margin-left:0%;width:100%;overflow:hidden;color:inherit;position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{display:flex;flex-direction:column;background:transparent;border-right:1px solid rgba(128,128,128,.2)}.bot-list[data-v-323dce07]{width:250px;min-width:250px;max-width:250px;flex-shrink:0}.channel-list[data-v-323dce07]{width:300px;min-width:300px;max-width:300px;flex-shrink:0}.message-area[data-v-323dce07]{flex:1;border-right:none}.panel-header[data-v-323dce07]{padding:16px;border-bottom:1px solid rgba(128,128,128,.2);background:transparent;display:flex;align-items:center;justify-content:space-between}.panel-header h3[data-v-323dce07]{margin:0;font-size:16px;font-weight:600;color:currentColor}.back-button[data-v-323dce07]{display:none;background:none;border:none;color:currentColor;font-size:18px;cursor:pointer;padding:4px 8px;border-radius:4px;transition:background-color .2s}.back-button[data-v-323dce07]:hover{background:#8080801a}.bot-items[data-v-323dce07],.channel-items[data-v-323dce07]{flex:1;overflow-y:auto;max-height:calc(100vh - 60px)}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{display:flex;align-items:center;padding:12px 16px;cursor:pointer;border-bottom:1px solid rgba(128,128,128,.1);transition:background-color .2s}.bot-item[data-v-323dce07]:hover,.channel-item[data-v-323dce07]:hover{background:#8080801a}.bot-item.active[data-v-323dce07],.channel-item.active[data-v-323dce07]{background:#2196f31a;border-right:3px solid #2196f3}.bot-avatar[data-v-323dce07]{width:40px;height:40px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0}.bot-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.avatar-placeholder[data-v-323dce07]{font-size:16px;font-weight:700;color:currentColor;opacity:.7}.bot-info[data-v-323dce07]{flex:1}.bot-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.bot-platform[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.bot-status[data-v-323dce07]{width:8px;height:8px;border-radius:50%;margin-left:8px}.bot-status.online[data-v-323dce07]{background:#4caf50}.bot-status.offline[data-v-323dce07]{background:#f44336}.channel-info[data-v-323dce07]{flex:1}.channel-name[data-v-323dce07]{font-weight:500;color:currentColor;margin-bottom:2px}.channel-type[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7}.channel-message-count[data-v-323dce07]{background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;position:relative;transition:all .2s ease}.channel-message-count.draggable-bubble[data-v-323dce07]{cursor:grab;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.channel-message-count.draggable-bubble[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 2px 8px #2196f34d}.channel-message-count.draggable-bubble[data-v-323dce07]:active,.channel-message-count.draggable-bubble.dragging[data-v-323dce07]{cursor:grabbing;background:#1565c0;box-shadow:0 4px 12px #2196f366}.dragging-clone[data-v-323dce07]{position:fixed;z-index:1000;pointer-events:none;transition:none;box-sizing:border-box;display:flex;align-items:center;justify-content:center;background:#2196f3;color:#fff;font-size:12px;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center;box-shadow:0 4px 12px #2196f366}.dragging-clone.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes pulseThreshold-323dce07{0%,to{opacity:.4;transform:scale(.9);border-color:#f4433699;box-shadow:0 0 15px #f4433633}50%{opacity:.8;transform:scale(1.1);border-color:#f44336;box-shadow:0 0 25px #f4433666}}@keyframes menuSlideIn-323dce07{0%{transform:translateY(8px);opacity:0}to{transform:translateY(0);opacity:1}}.message-content[data-v-323dce07]{display:flex;flex-direction:column;height:calc(100vh - 60px);overflow:hidden;position:relative}.message-history[data-v-323dce07]{flex:1;overflow-y:auto;padding:16px 16px 8px;max-height:calc(100vh - 200px)}.message-item[data-v-323dce07]{display:flex;margin-bottom:16px;padding:8px;border-radius:8px;transition:background-color .3s ease}.message-item[data-v-323dce07]:hover{background-color:#8080801a}.message-item.new-message[data-v-323dce07]{background-color:#4caf5033;animation:highlight-323dce07 2s ease-out}.message-item.bot-message[data-v-323dce07]{flex-direction:row-reverse;justify-content:flex-start}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-right:0;margin-left:12px}.message-item.bot-message .message-content-wrapper[data-v-323dce07]{display:flex;flex-direction:column;align-items:flex-end}.message-item.bot-message .message-header[data-v-323dce07]{display:flex;align-items:center;justify-content:flex-end;margin-bottom:4px}.message-item.bot-message .message-username[data-v-323dce07]{margin-right:0;margin-left:8px;order:2}.message-item.bot-message .message-time[data-v-323dce07]{order:1}.message-item.bot-message .message-text[data-v-323dce07]{background-color:#2196f31a;padding:8px 12px;border-radius:12px 12px 4px;display:inline-block;max-width:80%;text-align:left;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}@keyframes highlight-323dce07{0%{background-color:#4caf504d}to{background-color:transparent}}.message-avatar[data-v-323dce07]{width:32px;height:32px;margin-right:12px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#e0e0e0;flex-shrink:0}.message-avatar img[data-v-323dce07]{width:100%;height:100%;object-fit:cover}.message-avatar .avatar-placeholder[data-v-323dce07]{font-size:12px;font-weight:700;color:currentColor;opacity:.7}.message-content-wrapper[data-v-323dce07]{flex:1}.message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:4px}.message-username[data-v-323dce07]{font-weight:500;color:currentColor;margin-right:8px}.message-time[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.5}.message-text[data-v-323dce07]{color:currentColor;line-height:1.4;word-wrap:break-word;word-break:break-all;white-space:pre-wrap;max-width:100%;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-item:not(.bot-message) .message-text[data-v-323dce07]{background-color:#8080801a;padding:8px 12px;border-radius:12px 12px 12px 4px;display:inline-block;max-width:80%;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-input[data-v-323dce07]{display:flex;flex-direction:column;padding:12px 16px 16px;border-top:1px solid rgba(128,128,128,.2);background:transparent;flex-shrink:0;position:sticky;bottom:0;margin-top:-10px}.input-row[data-v-323dce07]{display:flex;gap:8px;align-items:center}.floating-scroll-button[data-v-323dce07]{position:absolute;right:24px;bottom:18%;width:48px;height:48px;background:#2196f3;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #2196f34d;color:#fff;transition:all .3s ease;z-index:100;border:2px solid rgba(255,255,255,.2)}.floating-scroll-button[data-v-323dce07]:hover{background:#1976d2;transform:scale(1.1);box-shadow:0 6px 16px #2196f366}.floating-scroll-button[data-v-323dce07]:active{transform:scale(.95)}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.message-image-container[data-v-323dce07]{margin:8px 0;max-width:100%;display:block}.message-image[data-v-323dce07]{border-radius:8px;object-fit:contain;display:block;cursor:pointer;transition:transform .2s ease}.message-image-loading[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#8080801a;border-radius:4px;color:currentColor;opacity:.7;font-size:12px}.message-image-error[data-v-323dce07]{display:inline-block;padding:8px 12px;background:#f443361a;border:1px solid rgba(244,67,54,.3);border-radius:4px;color:#f44336;font-size:12px;max-width:300px;word-break:break-word}.message-paragraph[data-v-323dce07]{display:block;margin-bottom:4px}.message-paragraph[data-v-323dce07]:last-child{margin-bottom:0}.forward-message-container[data-v-323dce07]{border:1px solid #ffffff;border-radius:8px;margin:4px 0;overflow:hidden;background:#f9f9f900}.forward-message-preview[data-v-323dce07]{padding:12px;cursor:pointer;transition:background-color .2s}.forward-message-preview[data-v-323dce07]:hover{background:#f0f0f0}.forward-message-title[data-v-323dce07]{font-weight:600;color:#333;margin-bottom:8px;font-size:14px}.forward-message-preview-item[data-v-323dce07]{color:#666;font-size:13px;margin:2px 0;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.forward-message-footer[data-v-323dce07]{display:flex;justify-content:space-between;align-items:center;margin-top:8px;padding-top:8px;border-top:1px solid #e8e8e8}.forward-message-count[data-v-323dce07]{color:#2196f3;font-size:12px}.forward-message-toggle[data-v-323dce07]{color:#666;font-size:12px}.forward-message-expanded[data-v-323dce07]{border-top:1px solid #e0e0e0;background:#fff;max-height:400px;overflow-y:auto}.forwarded-message-item[data-v-323dce07]{padding:12px;border-bottom:1px solid #f0f0f0}.forwarded-message-item[data-v-323dce07]:last-child{border-bottom:none}.forwarded-message-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:6px}.forwarded-message-nickname[data-v-323dce07]{font-weight:600;color:#333;font-size:13px}.forwarded-message-userid[data-v-323dce07]{color:#999;font-size:11px;margin-left:6px}.forwarded-message-content[data-v-323dce07]{color:#555;font-size:13px;line-height:1.4;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 4px;border-radius:3px;font-weight:500;cursor:pointer}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 4px;border-radius:3px;font-style:italic;cursor:help}.input-row input[data-v-323dce07]{flex:1;min-width:0;padding:8px 12px;border:1px solid rgba(128,128,128,.3);border-radius:4px;outline:none;background:transparent;color:currentColor}.input-row input[data-v-323dce07]:focus{border-color:#2196f3;box-shadow:0 0 0 2px #2196f333}.input-row input[data-v-323dce07]::placeholder{color:currentColor;opacity:.5}.input-row button[data-v-323dce07]{padding:8px 16px;background:#2196f3;color:#fff;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;flex-shrink:0;white-space:nowrap}.input-row button[data-v-323dce07]:hover:not(:disabled){background:#1976d2}.input-row button[data-v-323dce07]:disabled{background:#8080804d;cursor:not-allowed}.input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important}.message-input .input-row button.is-sending[data-v-323dce07]{background:#ffc107!important;color:#333!important;cursor:default!important;border-color:#ffc107!important}.empty-state[data-v-323dce07]{display:flex;align-items:center;justify-content:center;height:100%;color:currentColor;opacity:.5;font-size:14px}.message-text-content[data-v-323dce07]{display:inline;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;-webkit-hyphens:auto;hyphens:auto}.message-image-container[data-v-323dce07]{display:block;margin:4px 0}.message-image[data-v-323dce07]{border-radius:8px;margin:4px 0;display:block;cursor:pointer;transition:transform .2s ease;object-fit:contain;background:#8080801a}.message-image[data-v-323dce07]:hover{transform:scale(1.02)}.message-image-loading[data-v-323dce07]{height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3)}.message-image-error[data-v-323dce07]{min-height:60px;width:200px;border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#8080801a;color:currentColor;opacity:.7;font-size:14px;border:1px dashed rgba(128,128,128,.3);padding:8px;text-align:center}.message-at[data-v-323dce07]{background:#2196f31a;color:#2196f3;padding:2px 6px;border-radius:4px;font-weight:500;cursor:pointer;display:inline-block;margin:0 2px}.message-at[data-v-323dce07]:hover{background:#2196f333}.message-unknown[data-v-323dce07]{background:#ff98001a;color:#ff9800;padding:2px 6px;border-radius:4px;font-size:12px;display:inline-block;margin:0 2px;cursor:help}@keyframes pulse-323dce07{0%,to{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.1)}}.channel-message-count.will-delete[data-v-323dce07]{background:#f44336!important;animation:shake-323dce07 .3s ease-in-out infinite}@keyframes shake-323dce07{0%,to{transform:translate(0)}25%{transform:translate(-2px)}75%{transform:translate(2px)}}body.dragging-bubble-global[data-v-323dce07]{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:grabbing}.drag-threshold-circle[data-v-323dce07]{position:fixed;pointer-events:none;border:3px dashed rgba(244,67,54,.8);border-radius:50%;z-index:999;background:#f443361a;box-shadow:0 0 20px #f443364d;animation:pulseThreshold-323dce07 1.5s ease-in-out infinite}.context-menu[data-v-323dce07]{position:fixed;background:#ffffffa6;border:1px solid rgba(0,0,0,.1);border-radius:8px;box-shadow:0 8px 32px #00000026;z-index:10000;min-width:180px;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);overflow:hidden}.context-menu-item[data-v-323dce07]{padding:12px 16px;cursor:pointer;color:#333;font-size:14px;font-weight:500;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.08);position:relative}.context-menu-item[data-v-323dce07]:last-child{border-bottom:none}.context-menu-item[data-v-323dce07]:hover{background:#2196f31a;color:#1976d2;transform:translate(2px)}.context-menu-item.danger[data-v-323dce07]{color:#d32f2f}.context-menu-item.danger[data-v-323dce07]:hover{background:#f443361a;color:#c62828}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc1071a;border-left:3px solid #ffc107}.bot-item.pinned[data-v-323dce07]:before,.channel-item.pinned[data-v-323dce07]:before{content:"📌";position:absolute;left:4px;top:50%;transform:translateY(-50%);font-size:12px;opacity:.7}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{position:relative;padding-left:24px}@media (prefers-color-scheme: dark){.context-menu[data-v-323dce07]{background:#ffffff26;border-color:#fff3;box-shadow:0 8px 32px #0006}.context-menu-item[data-v-323dce07]{color:#fff;border-bottom-color:#ffffff1a}.context-menu-item[data-v-323dce07]:hover{background:#2196f333;color:#64b5f6}.context-menu-item.danger[data-v-323dce07]{color:#ff8a80}.context-menu-item.danger[data-v-323dce07]:hover{background:#f4433633;color:#ffab91}.bot-item.pinned[data-v-323dce07],.channel-item.pinned[data-v-323dce07]{background:#ffc10726}}.message-share-card[data-v-323dce07]{display:inline-block;width:75px;margin:8px 0;border:1px solid rgba(128,128,128,.2);border-radius:12px;background:#ffffff0d;transition:all .3s ease;cursor:pointer;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.message-share-card[data-v-323dce07]:hover{transform:translateY(-2px);box-shadow:0 8px 24px #00000026;border-color:#2196f34d}.share-card-preview[data-v-323dce07]{width:100%;position:relative;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:12px 12px 0 0}.share-card-image[data-v-323dce07]{max-width:calc(100% - 8px);width:auto;height:auto;object-fit:contain;transition:transform .3s ease;display:block;border-radius:4px}.message-share-card:hover .share-card-image[data-v-323dce07]{transform:scale(1.05)}.share-card-content[data-v-323dce07]{padding:8px}.share-card-header[data-v-323dce07]{display:flex;align-items:center;margin-bottom:12px;gap:12px}.share-card-icon[data-v-323dce07]{width:32px;height:32px;border-radius:8px;object-fit:cover;flex-shrink:0}.share-card-app-info[data-v-323dce07]{flex:1;min-width:0}.share-card-app-name[data-v-323dce07]{font-size:12px;color:currentColor;opacity:.7;margin-bottom:2px;font-weight:500}.share-card-title[data-v-323dce07]{font-size:10px;font-weight:600;color:currentColor;line-height:1.2;word-wrap:break-word;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.share-card-desc[data-v-323dce07]{font-size:14px;color:currentColor;opacity:.8;line-height:1.4;margin-bottom:12px;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;word-wrap:break-word}.share-card-link-hint[data-v-323dce07]{font-size:12px;color:#2196f3;font-weight:500;display:flex;align-items:center;gap:4px}.share-card-link-hint[data-v-323dce07]:after{content:"→";transition:transform .2s ease}.message-share-card:hover .share-card-link-hint[data-v-323dce07]:after{transform:translate(2px)}.message-json-error[data-v-323dce07],.message-json-raw[data-v-323dce07]{display:inline-block;margin:8px 0;max-width:400px}.json-error-text[data-v-323dce07]{color:#f44336;font-size:14px;font-weight:500}.json-label[data-v-323dce07]{color:currentColor;opacity:.7;font-size:12px;font-weight:500;margin-bottom:8px}.json-raw-data[data-v-323dce07]{margin-top:8px}.json-raw-data summary[data-v-323dce07]{cursor:pointer;font-size:12px;color:#2196f3;font-weight:500;padding:4px 8px;border-radius:4px;background:#2196f31a;display:inline-block;transition:background-color .2s ease}.json-raw-data summary[data-v-323dce07]:hover{background:#2196f333}.json-raw-content[data-v-323dce07]{margin-top:8px;padding:12px;background:#8080801a;border-radius:8px;font-family:Courier New,monospace;font-size:12px;color:currentColor;opacity:.8;white-space:pre-wrap;word-wrap:break-word;word-break:break-all;overflow-wrap:anywhere;max-height:200px;overflow-y:auto;border:1px solid rgba(128,128,128,.2)}@media (prefers-color-scheme: dark){.message-share-card[data-v-323dce07]{background:#ffffff14;border-color:#ffffff26}.message-share-card[data-v-323dce07]:hover{border-color:#2196f380;box-shadow:0 8px 24px #0000004d}.json-raw-content[data-v-323dce07]{background:#ffffff0d;border-color:#ffffff1a}}@media (max-width: 768px){.chat-container[data-v-323dce07]{position:relative}.bot-list[data-v-323dce07],.channel-list[data-v-323dce07],.message-area[data-v-323dce07]{position:absolute;top:0;left:0;width:100%;height:100%;transition:transform .3s ease;z-index:1}.bot-list[data-v-323dce07]{transform:translate(0);z-index:3}.channel-list[data-v-323dce07]{transform:translate(100%);z-index:2}.message-area[data-v-323dce07]{transform:translate(200%);z-index:1}.chat-container.show-channels .bot-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-channels .channel-list[data-v-323dce07]{transform:translate(0);z-index:3}.chat-container.show-channels .message-area[data-v-323dce07]{transform:translate(100%)}.chat-container.show-messages .bot-list[data-v-323dce07]{transform:translate(-200%)}.chat-container.show-messages .channel-list[data-v-323dce07]{transform:translate(-100%)}.chat-container.show-messages .message-area[data-v-323dce07]{transform:translate(0);z-index:3}.back-button[data-v-323dce07]{display:none!important}.panel-header[data-v-323dce07]{flex-direction:row-reverse;position:sticky;top:0;z-index:5;background:inherit}.panel-header h3[data-v-323dce07]{text-align:right}.floating-scroll-button[data-v-323dce07]{right:16px;bottom:70px;width:40px;height:40px}.message-input[data-v-323dce07]{padding:8px 12px 12px;position:fixed;bottom:0;left:0;right:0;background:inherit;border-top:1px solid rgba(128,128,128,.2);z-index:10}.input-row input[data-v-323dce07]{font-size:16px;padding:10px 12px}.input-row button[data-v-323dce07]{padding:10px 16px;font-size:16px}.message-history[data-v-323dce07]{padding:12px 12px 80px;max-height:calc(100vh - 140px)}.message-item[data-v-323dce07]{margin-bottom:12px;padding:6px}.message-text[data-v-323dce07]{max-width:90%!important}.message-avatar[data-v-323dce07]{width:28px;height:28px;margin-right:8px}.message-item.bot-message .message-avatar[data-v-323dce07]{margin-left:8px}.message-image[data-v-323dce07]{max-width:280px;max-height:160px}.quote-content .message-image[data-v-323dce07]{max-width:150px;max-height:80px}.context-menu[data-v-323dce07]{min-width:160px;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}.context-menu-item[data-v-323dce07]{padding:14px 16px;font-size:16px}.bot-item[data-v-323dce07],.channel-item[data-v-323dce07]{padding:14px 16px}.bot-avatar[data-v-323dce07]{width:36px;height:36px;margin-right:10px}.bot-name[data-v-323dce07],.channel-name[data-v-323dce07]{font-size:15px}.bot-platform[data-v-323dce07],.channel-type[data-v-323dce07]{font-size:13px}}@media (min-width: 769px) and (max-width: 1024px){.bot-list[data-v-323dce07]{width:220px;min-width:220px;max-width:220px}.channel-list[data-v-323dce07]{width:280px;min-width:280px;max-width:280px}.message-image[data-v-323dce07]{max-width:350px;max-height:180px}}.chat-container.swiping[data-v-323dce07]{overflow:hidden}.bot-list.swiping[data-v-323dce07],.channel-list.swiping[data-v-323dce07],.message-area.swiping[data-v-323dce07]{transition:none!important}.swipe-indicator[data-v-323dce07]{position:fixed;top:50%;left:20px;transform:translateY(-50%);background:#2196f3cc;color:#fff;padding:8px 12px;border-radius:20px;font-size:14px;z-index:1000;opacity:0;transition:opacity .2s ease;pointer-events:none;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.swipe-indicator.show[data-v-323dce07]{opacity:1}.message-area .message-content[data-v-323dce07]{padding-bottom:80px}.image-preview-container[data-v-323dce07]{display:flex;flex-wrap:wrap;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid rgba(128,128,128,.1)}.image-preview-item[data-v-323dce07]{position:relative;width:60px;height:60px;border-radius:8px;overflow:hidden;border:2px solid rgba(33,150,243,.3);background:#8080801a}.preview-image[data-v-323dce07]{width:100%;height:100%;object-fit:cover;display:block}.remove-image-btn[data-v-323dce07]{position:absolute;top:-6px;right:-6px;width:20px;height:20px;border-radius:50%;background:#f44336;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px;transition:all .2s ease;box-shadow:0 2px 4px #0003}.remove-image-btn[data-v-323dce07]:hover{background:#d32f2f;transform:scale(1.1)}.input-actions[data-v-323dce07]{position:relative;margin-right:8px}.add-button[data-v-323dce07]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#667eea,#764ba2);border:none;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .3s cubic-bezier(.4,0,.2,1);flex-shrink:0;box-shadow:0 2px 8px #667eea4d;position:relative;overflow:hidden}.add-button[data-v-323dce07]:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(135deg,#fff3,#ffffff1a);border-radius:12px;opacity:0;transition:opacity .3s ease}.add-button[data-v-323dce07]:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 4px 16px #667eea66}.add-button[data-v-323dce07]:hover:before{opacity:1}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#f093fb,#f5576c);transform:translateY(-2px) scale(1.05) rotate(45deg);box-shadow:0 4px 16px #f5576c66}.add-button[data-v-323dce07]:active{transform:translateY(0) scale(.98);transition:all .1s ease}.action-menu[data-v-323dce07]{position:absolute;bottom:100%;left:0;margin-bottom:12px;background:#fffffffa;border:none;border-radius:16px;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);overflow:hidden;z-index:1000;min-width:140px;transform:translateY(8px);opacity:0;animation:menuSlideIn-323dce07 .3s cubic-bezier(.4,0,.2,1) forwards}.action-menu-item[data-v-323dce07]{display:flex;align-items:center;gap:12px;padding:14px 18px;background:none;border:none;color:#333;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);width:100%;text-align:left;position:relative}.action-menu-item[data-v-323dce07]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:linear-gradient(135deg,#667eea,#764ba2);transform:scaleY(0);transition:transform .2s cubic-bezier(.4,0,.2,1)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#667eea14,#764ba214);color:#667eea;transform:translate(4px)}.action-menu-item[data-v-323dce07]:hover:before{transform:scaleY(1)}.action-menu-item svg[data-v-323dce07]{flex-shrink:0}@media (prefers-color-scheme: dark){.action-menu[data-v-323dce07]{background:#1e1e1efa;box-shadow:0 8px 32px #0000004d,0 2px 8px #0003}.action-menu-item[data-v-323dce07]{color:#fff}.action-menu-item[data-v-323dce07]:before{background:linear-gradient(135deg,#4facfe,#00f2fe)}.action-menu-item[data-v-323dce07]:hover{background:linear-gradient(90deg,#4facfe1f,#00f2fe1f);color:#4facfe}.add-button[data-v-323dce07]{background:linear-gradient(135deg,#4facfe,#00f2fe);box-shadow:0 2px 8px #4facfe4d}.add-button[data-v-323dce07]:hover{box-shadow:0 4px 16px #4facfe66}.add-button.active[data-v-323dce07]{background:linear-gradient(135deg,#fa709a,#fee140);box-shadow:0 4px 16px #fa709a66}.image-preview-item[data-v-323dce07]{border-color:#64b5f680;background:#ffffff0d}}@media (max-width: 768px){.image-preview-container[data-v-323dce07]{padding:6px 0;margin-bottom:6px}.image-preview-item[data-v-323dce07]{width:50px;height:50px}.add-button[data-v-323dce07]{width:32px;height:32px;border-radius:10px}.action-menu[data-v-323dce07]{min-width:100px}.action-menu-item[data-v-323dce07]{padding:10px 12px;font-size:13px}.remove-image-btn[data-v-323dce07]{width:18px;height:18px;top:-5px;right:-5px}}.message-history[data-v-323dce07]::-webkit-scrollbar{width:6px}.message-history[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.bot-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.bot-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.channel-items[data-v-323dce07]::-webkit-scrollbar{width:6px}.channel-items[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar{width:6px}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}.json-raw-content[data-v-323dce07]::-webkit-scrollbar{width:6px}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-track{background:transparent}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px;transition:background-color .3s}.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#90939980}@media (prefers-color-scheme: dark){.message-history[data-v-323dce07]::-webkit-scrollbar-thumb,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb{background-color:#fff3}.message-history[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.bot-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.channel-items[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.forward-message-expanded[data-v-323dce07]::-webkit-scrollbar-thumb:hover,.json-raw-content[data-v-323dce07]::-webkit-scrollbar-thumb:hover{background-color:#fff6}}.layout-iframe{width:100%;height:100%;border:none}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FileManager } from './file-manager';
|
|
2
|
+
import { Context } from 'koishi';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
export declare class ApiHandlers {
|
|
5
|
+
private ctx;
|
|
6
|
+
private config;
|
|
7
|
+
private fileManager;
|
|
8
|
+
private logger;
|
|
9
|
+
constructor(ctx: Context, config: Config, fileManager: FileManager);
|
|
10
|
+
registerApiHandlers(): void;
|
|
11
|
+
private isFileUrl;
|
|
12
|
+
private createFileUrl;
|
|
13
|
+
private handleLocalFileRequest;
|
|
14
|
+
private setupTempFileCleanup;
|
|
15
|
+
private cleanupTempImagesByCount;
|
|
16
|
+
private logInfo;
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ChatData, MessageInfo } from './types';
|
|
2
|
+
import { Context } from 'koishi';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
export declare class FileManager {
|
|
5
|
+
private ctx;
|
|
6
|
+
private config;
|
|
7
|
+
private dataFilePath;
|
|
8
|
+
private fileOperationLock;
|
|
9
|
+
private logger;
|
|
10
|
+
private utils;
|
|
11
|
+
constructor(ctx: Context, config: Config);
|
|
12
|
+
private ensureDataDir;
|
|
13
|
+
readChatDataFromFile(): ChatData;
|
|
14
|
+
writeChatDataToFile(data: ChatData): void;
|
|
15
|
+
cleanExcessMessages(data: ChatData): ChatData;
|
|
16
|
+
addMessageToFile(messageInfo: MessageInfo): Promise<void>;
|
|
17
|
+
private logInfo;
|
|
18
|
+
}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import { Config } from './config';
|
|
3
|
+
export declare const name = "chat-patch";
|
|
4
|
+
export declare const reusable = false;
|
|
5
|
+
export declare const filter = true;
|
|
6
|
+
export declare const inject: {
|
|
7
|
+
required: string[];
|
|
8
|
+
};
|
|
9
|
+
export declare const usage = "\n\n---\n\n\u5F00\u542F\u540E\uFF0C\u5373\u53EF\u5728koishi\u63A7\u5236\u53F0\u64CD\u4F5C\u673A\u5668\u4EBA\u6536\u53D1\u6D88\u606F\u5566\n\n\u6682\u65F6\u53EA\u652F\u6301\u63A5\u53D7\u56FE\u6587\u6D88\u606F / \u53D1\u9001\u6587\u5B57\u6D88\u606F\n\n---\n";
|
|
10
|
+
export { Config } from './config';
|
|
11
|
+
export declare function apply(ctx: Context, config: Config): Promise<void>;
|
package/lib/index.js
CHANGED
|
@@ -41,10 +41,6 @@ __export(src_exports, {
|
|
|
41
41
|
module.exports = __toCommonJS(src_exports);
|
|
42
42
|
var import_node_path2 = __toESM(require("node:path"));
|
|
43
43
|
|
|
44
|
-
// src/file-manager.ts
|
|
45
|
-
var import_node_path = __toESM(require("node:path"));
|
|
46
|
-
var import_node_fs = __toESM(require("node:fs"));
|
|
47
|
-
|
|
48
44
|
// src/utils.ts
|
|
49
45
|
var Utils = class {
|
|
50
46
|
constructor(config) {
|
|
@@ -128,147 +124,6 @@ var Utils = class {
|
|
|
128
124
|
}
|
|
129
125
|
};
|
|
130
126
|
|
|
131
|
-
// src/file-manager.ts
|
|
132
|
-
var FileManager = class {
|
|
133
|
-
constructor(ctx, config) {
|
|
134
|
-
this.ctx = ctx;
|
|
135
|
-
this.config = config;
|
|
136
|
-
this.dataFilePath = import_node_path.default.resolve(ctx.baseDir, "data", "chat-patch", "chat-data.json");
|
|
137
|
-
this.logger = ctx.logger("chat-patch");
|
|
138
|
-
this.utils = new Utils(config);
|
|
139
|
-
}
|
|
140
|
-
static {
|
|
141
|
-
__name(this, "FileManager");
|
|
142
|
-
}
|
|
143
|
-
dataFilePath;
|
|
144
|
-
fileOperationLock = Promise.resolve();
|
|
145
|
-
logger;
|
|
146
|
-
utils;
|
|
147
|
-
// 确保目录存在
|
|
148
|
-
ensureDataDir() {
|
|
149
|
-
const dir = import_node_path.default.dirname(this.dataFilePath);
|
|
150
|
-
if (!import_node_fs.default.existsSync(dir)) {
|
|
151
|
-
import_node_fs.default.mkdirSync(dir, { recursive: true });
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// 从JSON文件读取数据
|
|
155
|
-
readChatDataFromFile() {
|
|
156
|
-
try {
|
|
157
|
-
if (import_node_fs.default.existsSync(this.dataFilePath)) {
|
|
158
|
-
const jsonData = import_node_fs.default.readFileSync(this.dataFilePath, "utf8");
|
|
159
|
-
const data = JSON.parse(jsonData);
|
|
160
|
-
return {
|
|
161
|
-
bots: data.bots || {},
|
|
162
|
-
channels: data.channels || {},
|
|
163
|
-
messages: data.messages || {},
|
|
164
|
-
pinnedBots: data.pinnedBots || [],
|
|
165
|
-
pinnedChannels: data.pinnedChannels || [],
|
|
166
|
-
lastSaveTime: data.lastSaveTime
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
} catch (error) {
|
|
170
|
-
this.logger.error("读取聊天数据失败:", error);
|
|
171
|
-
}
|
|
172
|
-
return {
|
|
173
|
-
bots: {},
|
|
174
|
-
channels: {},
|
|
175
|
-
messages: {},
|
|
176
|
-
pinnedBots: [],
|
|
177
|
-
pinnedChannels: []
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
// 写入数据到JSON文件
|
|
181
|
-
writeChatDataToFile(data) {
|
|
182
|
-
try {
|
|
183
|
-
this.ensureDataDir();
|
|
184
|
-
data.lastSaveTime = Date.now();
|
|
185
|
-
const jsonData = JSON.stringify(data, null, 2);
|
|
186
|
-
import_node_fs.default.writeFileSync(this.dataFilePath, jsonData, "utf8");
|
|
187
|
-
} catch (error) {
|
|
188
|
-
this.logger.error("写入聊天数据失败:", error);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
// 清理超量消息
|
|
192
|
-
cleanExcessMessages(data) {
|
|
193
|
-
let cleanedCount = 0;
|
|
194
|
-
const cleanedMessages = {};
|
|
195
|
-
for (const [channelKey, messages] of Object.entries(data.messages)) {
|
|
196
|
-
if (messages.length > this.config.maxMessagesPerChannel) {
|
|
197
|
-
const sortedMessages = [...messages].sort((a, b) => a.timestamp - b.timestamp);
|
|
198
|
-
const keptMessages = sortedMessages.slice(-this.config.maxMessagesPerChannel);
|
|
199
|
-
cleanedCount += messages.length - keptMessages.length;
|
|
200
|
-
cleanedMessages[channelKey] = keptMessages;
|
|
201
|
-
this.logInfo(`频道 ${channelKey} 清理了 ${messages.length - keptMessages.length} 条旧消息,保留最新 ${keptMessages.length} 条`);
|
|
202
|
-
} else {
|
|
203
|
-
cleanedMessages[channelKey] = messages;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
if (cleanedCount > 0) {
|
|
207
|
-
this.logInfo("总共清理超量消息:", cleanedCount, "条");
|
|
208
|
-
}
|
|
209
|
-
return {
|
|
210
|
-
...data,
|
|
211
|
-
messages: cleanedMessages
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
// 添加消息到JSON文件(使用锁机制防止并发冲突)
|
|
215
|
-
async addMessageToFile(messageInfo) {
|
|
216
|
-
this.fileOperationLock = this.fileOperationLock.then(async () => {
|
|
217
|
-
const data = this.readChatDataFromFile();
|
|
218
|
-
const channelKey = `${messageInfo.selfId}:${messageInfo.channelId}`;
|
|
219
|
-
if (!data.messages[channelKey]) {
|
|
220
|
-
data.messages[channelKey] = [];
|
|
221
|
-
}
|
|
222
|
-
const existingMessage = data.messages[channelKey].find((m) => m.id === messageInfo.id);
|
|
223
|
-
if (existingMessage) {
|
|
224
|
-
this.logInfo("消息已存在,跳过保存:", {
|
|
225
|
-
channelKey,
|
|
226
|
-
messageId: messageInfo.id,
|
|
227
|
-
existingType: existingMessage.type,
|
|
228
|
-
existingContent: existingMessage.content,
|
|
229
|
-
newType: messageInfo.type,
|
|
230
|
-
newContent: messageInfo.content
|
|
231
|
-
});
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
if (!messageInfo.timestamp) {
|
|
235
|
-
messageInfo.timestamp = Date.now();
|
|
236
|
-
}
|
|
237
|
-
const cleanedMessageInfo = this.utils.cleanBase64Content(messageInfo);
|
|
238
|
-
const beforeCount = data.messages[channelKey].length;
|
|
239
|
-
data.messages[channelKey].push(cleanedMessageInfo);
|
|
240
|
-
const afterCount = data.messages[channelKey].length;
|
|
241
|
-
if (data.messages[channelKey].length > this.config.maxMessagesPerChannel) {
|
|
242
|
-
data.messages[channelKey].sort((a, b) => a.timestamp - b.timestamp);
|
|
243
|
-
const removedCount = data.messages[channelKey].length - this.config.maxMessagesPerChannel;
|
|
244
|
-
data.messages[channelKey] = data.messages[channelKey].slice(-this.config.maxMessagesPerChannel);
|
|
245
|
-
this.logInfo(`频道 ${channelKey} 达到消息上限,清理了 ${removedCount} 条旧消息`);
|
|
246
|
-
}
|
|
247
|
-
this.writeChatDataToFile(data);
|
|
248
|
-
const isCommandMessage = messageInfo.content?.startsWith("++") || messageInfo.content?.startsWith(".");
|
|
249
|
-
this.logInfo("添加消息到文件:", {
|
|
250
|
-
channelKey,
|
|
251
|
-
messageId: messageInfo.id,
|
|
252
|
-
content: messageInfo.content,
|
|
253
|
-
type: messageInfo.type,
|
|
254
|
-
userId: messageInfo.userId,
|
|
255
|
-
username: messageInfo.username,
|
|
256
|
-
timestamp: messageInfo.timestamp,
|
|
257
|
-
isCommandMessage,
|
|
258
|
-
消息数变化: `${beforeCount} -> ${afterCount} -> ${data.messages[channelKey].length}`
|
|
259
|
-
});
|
|
260
|
-
}).catch((error) => {
|
|
261
|
-
this.logger.error("保存消息时发生错误:", error);
|
|
262
|
-
});
|
|
263
|
-
await this.fileOperationLock;
|
|
264
|
-
}
|
|
265
|
-
logInfo(...args) {
|
|
266
|
-
if (this.config.loggerinfo) {
|
|
267
|
-
this.logger.info(...args);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
|
|
272
127
|
// src/message-handler.ts
|
|
273
128
|
var MessageHandler = class {
|
|
274
129
|
constructor(ctx, config, fileManager) {
|
|
@@ -472,6 +327,149 @@ var MessageHandler = class {
|
|
|
472
327
|
}
|
|
473
328
|
};
|
|
474
329
|
|
|
330
|
+
// src/file-manager.ts
|
|
331
|
+
var import_node_path = __toESM(require("node:path"));
|
|
332
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
333
|
+
var FileManager = class {
|
|
334
|
+
constructor(ctx, config) {
|
|
335
|
+
this.ctx = ctx;
|
|
336
|
+
this.config = config;
|
|
337
|
+
this.dataFilePath = import_node_path.default.resolve(ctx.baseDir, "data", "chat-patch", "chat-data.json");
|
|
338
|
+
this.logger = ctx.logger("chat-patch");
|
|
339
|
+
this.utils = new Utils(config);
|
|
340
|
+
}
|
|
341
|
+
static {
|
|
342
|
+
__name(this, "FileManager");
|
|
343
|
+
}
|
|
344
|
+
dataFilePath;
|
|
345
|
+
fileOperationLock = Promise.resolve();
|
|
346
|
+
logger;
|
|
347
|
+
utils;
|
|
348
|
+
// 确保目录存在
|
|
349
|
+
ensureDataDir() {
|
|
350
|
+
const dir = import_node_path.default.dirname(this.dataFilePath);
|
|
351
|
+
if (!import_node_fs.default.existsSync(dir)) {
|
|
352
|
+
import_node_fs.default.mkdirSync(dir, { recursive: true });
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// 从JSON文件读取数据
|
|
356
|
+
readChatDataFromFile() {
|
|
357
|
+
try {
|
|
358
|
+
if (import_node_fs.default.existsSync(this.dataFilePath)) {
|
|
359
|
+
const jsonData = import_node_fs.default.readFileSync(this.dataFilePath, "utf8");
|
|
360
|
+
const data = JSON.parse(jsonData);
|
|
361
|
+
return {
|
|
362
|
+
bots: data.bots || {},
|
|
363
|
+
channels: data.channels || {},
|
|
364
|
+
messages: data.messages || {},
|
|
365
|
+
pinnedBots: data.pinnedBots || [],
|
|
366
|
+
pinnedChannels: data.pinnedChannels || [],
|
|
367
|
+
lastSaveTime: data.lastSaveTime
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
} catch (error) {
|
|
371
|
+
this.logger.error("读取聊天数据失败:", error);
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
bots: {},
|
|
375
|
+
channels: {},
|
|
376
|
+
messages: {},
|
|
377
|
+
pinnedBots: [],
|
|
378
|
+
pinnedChannels: []
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
// 写入数据到JSON文件
|
|
382
|
+
writeChatDataToFile(data) {
|
|
383
|
+
try {
|
|
384
|
+
this.ensureDataDir();
|
|
385
|
+
data.lastSaveTime = Date.now();
|
|
386
|
+
const jsonData = JSON.stringify(data, null, 2);
|
|
387
|
+
import_node_fs.default.writeFileSync(this.dataFilePath, jsonData, "utf8");
|
|
388
|
+
} catch (error) {
|
|
389
|
+
this.logger.error("写入聊天数据失败:", error);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// 清理超量消息
|
|
393
|
+
cleanExcessMessages(data) {
|
|
394
|
+
let cleanedCount = 0;
|
|
395
|
+
const cleanedMessages = {};
|
|
396
|
+
for (const [channelKey, messages] of Object.entries(data.messages)) {
|
|
397
|
+
if (messages.length > this.config.maxMessagesPerChannel) {
|
|
398
|
+
const sortedMessages = [...messages].sort((a, b) => a.timestamp - b.timestamp);
|
|
399
|
+
const keptMessages = sortedMessages.slice(-this.config.maxMessagesPerChannel);
|
|
400
|
+
cleanedCount += messages.length - keptMessages.length;
|
|
401
|
+
cleanedMessages[channelKey] = keptMessages;
|
|
402
|
+
this.logInfo(`频道 ${channelKey} 清理了 ${messages.length - keptMessages.length} 条旧消息,保留最新 ${keptMessages.length} 条`);
|
|
403
|
+
} else {
|
|
404
|
+
cleanedMessages[channelKey] = messages;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (cleanedCount > 0) {
|
|
408
|
+
this.logInfo("总共清理超量消息:", cleanedCount, "条");
|
|
409
|
+
}
|
|
410
|
+
return {
|
|
411
|
+
...data,
|
|
412
|
+
messages: cleanedMessages
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
// 添加消息到JSON文件(使用锁机制防止并发冲突)
|
|
416
|
+
async addMessageToFile(messageInfo) {
|
|
417
|
+
this.fileOperationLock = this.fileOperationLock.then(async () => {
|
|
418
|
+
const data = this.readChatDataFromFile();
|
|
419
|
+
const channelKey = `${messageInfo.selfId}:${messageInfo.channelId}`;
|
|
420
|
+
if (!data.messages[channelKey]) {
|
|
421
|
+
data.messages[channelKey] = [];
|
|
422
|
+
}
|
|
423
|
+
const existingMessage = data.messages[channelKey].find((m) => m.id === messageInfo.id);
|
|
424
|
+
if (existingMessage) {
|
|
425
|
+
this.logInfo("消息已存在,跳过保存:", {
|
|
426
|
+
channelKey,
|
|
427
|
+
messageId: messageInfo.id,
|
|
428
|
+
existingType: existingMessage.type,
|
|
429
|
+
existingContent: existingMessage.content,
|
|
430
|
+
newType: messageInfo.type,
|
|
431
|
+
newContent: messageInfo.content
|
|
432
|
+
});
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (!messageInfo.timestamp) {
|
|
436
|
+
messageInfo.timestamp = Date.now();
|
|
437
|
+
}
|
|
438
|
+
const cleanedMessageInfo = this.utils.cleanBase64Content(messageInfo);
|
|
439
|
+
const beforeCount = data.messages[channelKey].length;
|
|
440
|
+
data.messages[channelKey].push(cleanedMessageInfo);
|
|
441
|
+
const afterCount = data.messages[channelKey].length;
|
|
442
|
+
if (data.messages[channelKey].length > this.config.maxMessagesPerChannel) {
|
|
443
|
+
data.messages[channelKey].sort((a, b) => a.timestamp - b.timestamp);
|
|
444
|
+
const removedCount = data.messages[channelKey].length - this.config.maxMessagesPerChannel;
|
|
445
|
+
data.messages[channelKey] = data.messages[channelKey].slice(-this.config.maxMessagesPerChannel);
|
|
446
|
+
this.logInfo(`频道 ${channelKey} 达到消息上限,清理了 ${removedCount} 条旧消息`);
|
|
447
|
+
}
|
|
448
|
+
this.writeChatDataToFile(data);
|
|
449
|
+
const isCommandMessage = messageInfo.content?.startsWith("++") || messageInfo.content?.startsWith(".");
|
|
450
|
+
this.logInfo("添加消息到文件:", {
|
|
451
|
+
channelKey,
|
|
452
|
+
messageId: messageInfo.id,
|
|
453
|
+
content: messageInfo.content,
|
|
454
|
+
type: messageInfo.type,
|
|
455
|
+
userId: messageInfo.userId,
|
|
456
|
+
username: messageInfo.username,
|
|
457
|
+
timestamp: messageInfo.timestamp,
|
|
458
|
+
isCommandMessage,
|
|
459
|
+
消息数变化: `${beforeCount} -> ${afterCount} -> ${data.messages[channelKey].length}`
|
|
460
|
+
});
|
|
461
|
+
}).catch((error) => {
|
|
462
|
+
this.logger.error("保存消息时发生错误:", error);
|
|
463
|
+
});
|
|
464
|
+
await this.fileOperationLock;
|
|
465
|
+
}
|
|
466
|
+
logInfo(...args) {
|
|
467
|
+
if (this.config.loggerinfo) {
|
|
468
|
+
this.logger.info(...args);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
|
|
475
473
|
// src/api-handlers.ts
|
|
476
474
|
var import_koishi = require("koishi");
|
|
477
475
|
var import_node_url = require("node:url");
|
|
@@ -956,7 +954,7 @@ var Config = import_koishi2.Schema.intersect([
|
|
|
956
954
|
// src/index.ts
|
|
957
955
|
var name = "chat-patch";
|
|
958
956
|
var reusable = false;
|
|
959
|
-
var filter =
|
|
957
|
+
var filter = true;
|
|
960
958
|
var inject = {
|
|
961
959
|
required: ["console"]
|
|
962
960
|
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Session } from 'koishi';
|
|
2
|
+
import { FileManager } from './file-manager';
|
|
3
|
+
import { Config } from './config';
|
|
4
|
+
export declare class MessageHandler {
|
|
5
|
+
private ctx;
|
|
6
|
+
private config;
|
|
7
|
+
private fileManager;
|
|
8
|
+
private logger;
|
|
9
|
+
private utils;
|
|
10
|
+
constructor(ctx: Context, config: Config, fileManager: FileManager);
|
|
11
|
+
updateBotInfoToFile(session: Session): Promise<void>;
|
|
12
|
+
updateChannelInfoToFile(session: Session): Promise<string>;
|
|
13
|
+
broadcastMessageEvent(session: Session): Promise<void>;
|
|
14
|
+
broadcastBotMessageEvent(session: Session): Promise<void>;
|
|
15
|
+
private logInfo;
|
|
16
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-chat-patch",
|
|
3
3
|
"description": "[<ruby>chat-patch<rp>(</rp><rt>点我预览效果</rt><rp>)</rp></ruby>](https://i0.hdslb.com/bfs/openplatform/71074dfc9e5256fc3333d8bd8478bec1af874046.png) 视奸小插件((bushi( (低性能警告)。手机端适配。灵感来自 chat 插件。",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.12",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
7
7
|
"files": [
|
package/src/api-handlers.ts
CHANGED
package/src/file-manager.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import path from 'node:path'
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import { Context, Logger } from 'koishi'
|
|
4
1
|
import { ChatData, MessageInfo } from './types'
|
|
2
|
+
import { Context, Logger } from 'koishi'
|
|
5
3
|
import { Config } from './config'
|
|
6
4
|
import { Utils } from './utils'
|
|
7
5
|
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import fs from 'node:fs'
|
|
8
|
+
|
|
8
9
|
export class FileManager {
|
|
9
10
|
private dataFilePath: string
|
|
10
11
|
private fileOperationLock = Promise.resolve()
|
package/src/index.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
import { } from '@koishijs/plugin-console'
|
|
3
|
+
import { Context } from 'koishi'
|
|
3
4
|
import path from 'node:path'
|
|
4
|
-
import fs from 'node:fs'
|
|
5
5
|
|
|
6
|
-
import { Config } from './config'
|
|
7
|
-
import { FileManager } from './file-manager'
|
|
8
6
|
import { MessageHandler } from './message-handler'
|
|
7
|
+
import { FileManager } from './file-manager'
|
|
9
8
|
import { ApiHandlers } from './api-handlers'
|
|
9
|
+
import { Config } from './config'
|
|
10
10
|
import { Utils } from './utils'
|
|
11
11
|
|
|
12
12
|
export const name = 'chat-patch'
|
|
13
13
|
export const reusable = false
|
|
14
|
-
export const filter =
|
|
14
|
+
export const filter = true
|
|
15
15
|
export const inject = {
|
|
16
16
|
required: ['console']
|
|
17
17
|
}
|
package/src/message-handler.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { BotInfo, ChannelInfo, MessageInfo, QuoteInfo } from './types'
|
|
1
2
|
import { Context, Session, h, Logger } from 'koishi'
|
|
2
|
-
import { Config } from './config'
|
|
3
3
|
import { FileManager } from './file-manager'
|
|
4
|
+
import { Config } from './config'
|
|
4
5
|
import { Utils } from './utils'
|
|
5
|
-
import { BotInfo, ChannelInfo, MessageInfo, QuoteInfo } from './types'
|
|
6
6
|
|
|
7
7
|
export class MessageHandler {
|
|
8
8
|
private logger: Logger
|