pull/1154/head
NanoAim 2025-07-05 12:59:15 +08:00
parent 6a98a1259a
commit 252d33f001
8 changed files with 56 additions and 10 deletions

2
external/lang vendored

@ -1 +1 @@
Subproject commit 8ecb9a34b1b459b5280a6351a4044dfa44b68019
Subproject commit 7f1f53ad388f9e3eab1533556d2918c66918790d

2
external/revolt.js vendored

@ -1 +1 @@
Subproject commit 64121957a7eb97cb0eb3c0aba20541fecab4d934
Subproject commit 3cd1f4ec377bb11ca8cfeab6dcd48e37d0cdbdfb

View File

@ -120,9 +120,10 @@ const Message = observer(
contrast={contrast}
sending={typeof queued !== "undefined"}
mention={
message.mention_ids && client.user
? message.mention_ids.includes(client.user._id)
: undefined
client.user && (
(message.mention_ids?.includes(client.user._id)) ||
(message as any).mentionsEveryone
) || undefined
}
failed={typeof queued?.error !== "undefined"}
{...(attachContext

View File

@ -23,7 +23,7 @@ import { RenderAnchor } from "./plugins/anchors";
import { remarkChannels, RenderChannel } from "./plugins/channels";
import { isOnlyEmoji, remarkEmoji, RenderEmoji } from "./plugins/emoji";
import { remarkHtmlToText } from "./plugins/htmlToText";
import { remarkMention, RenderMention } from "./plugins/mentions";
import { remarkMention, RenderMention, remarkEveryone, RenderEveryoneMention } from "./plugins/mentions";
import { remarkSpoiler, RenderSpoiler } from "./plugins/spoiler";
import { remarkTimestamps } from "./plugins/timestamps";
import "./prism";
@ -39,6 +39,7 @@ const Null: React.FC = () => null;
const components = {
emoji: RenderEmoji,
mention: RenderMention,
everyone: RenderEveryoneMention,
spoiler: RenderSpoiler,
channel: RenderChannel,
a: RenderAnchor,
@ -143,6 +144,7 @@ const render = unified()
.use(remarkTimestamps)
.use(remarkEmoji)
.use(remarkMention)
.use(remarkEveryone)
.use(remarkHtmlToText)
.use(remarkRehype, {
handlers,

View File

@ -2,6 +2,6 @@ import { passThroughComponents } from "./plugins/remarkRegexComponent";
import { timestampHandler } from "./plugins/timestamps";
export const handlers = {
...passThroughComponents("emoji", "spoiler", "mention", "channel"),
...passThroughComponents("emoji", "spoiler", "mention", "channel", "everyone"),
timestamp: timestampHandler,
};

View File

@ -1,6 +1,5 @@
import { RE_MENTIONS } from "revolt.js";
import { RE_MENTIONS, RE_EVERYONE } from "revolt.js";
import styled from "styled-components";
import { clientController } from "../../../controllers/client/ClientController";
import UserShort from "../../common/user/UserShort";
import { createComponent, CustomComponentProps } from "./remarkRegexComponent";
@ -48,6 +47,33 @@ export function RenderMention({ match }: CustomComponentProps) {
);
}
const EveryoneMention = styled.span`
padding: 0 4px;
flex-shrink: 0;
font-weight: 600;
cursor: default;
color: var(--foreground);
background: var(--secondary-background);
border-radius: calc(var(--border-radius) * 2);
transition: 0.1s ease filter;
&:hover {
filter: brightness(0.75);
}
`;
export function RenderEveryoneMention() {
return (
<EveryoneMention>
@everyone
</EveryoneMention>
);
}
export const remarkMention = createComponent("mention", RE_MENTIONS, (match) =>
clientController.getAvailableClient().users.has(match),
);
export const remarkEveryone = createComponent("everyone", RE_EVERYONE, () => true);

View File

@ -164,6 +164,14 @@ export default class State {
// Register events for notifications.
client.addListener("message", this.notifications.onMessage);
client.addListener(
"message/mention",
this.notifications.onMessage,
);
client.addListener(
"message/mention/everyone",
this.notifications.onMessage,
);
client.addListener(
"user/relationship",
this.notifications.onRelationship,
@ -268,6 +276,14 @@ export default class State {
client.removeListener("message", this.queue.onMessage);
client.removeListener("packet", this.onPacket);
client.removeListener("message", this.notifications.onMessage);
client.removeListener(
"message/mention",
this.notifications.onMessage,
);
client.removeListener(
"message/mention/everyone",
this.notifications.onMessage,
);
client.removeListener(
"user/relationship",
this.notifications.onRelationship,

View File

@ -157,7 +157,8 @@ export default class NotificationOptions
}
// Check channel notification settings
const mentioned = message.mention_ids?.includes(user._id);
const mentioned = message.mention_ids?.includes(user._id) ||
(message as any).mentionsEveryone;
switch (this.computeForChannel(message.channel!)) {
case "muted":
case "none":