import {ViewReasonId} from "tc-shared/ConnectionHandler"; import * as React from "react"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {formatDate} from "tc-shared/MessageFormatter"; import {BBCodeRenderer} from "tc-shared/text/bbcode"; import {format_time} from "tc-shared/ui/frames/chat"; import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration"; import {ChannelTag, ClientTag} from "tc-shared/ui/tree/EntryTags"; import {EventChannelData, EventClient, EventType, TypeInfo} from "tc-shared/connectionlog/Definitions"; const cssStyle = require("./DispatcherLog.scss"); const cssStyleRenderer = require("./Renderer.scss"); export type RendererEvent = (data: TypeInfo[T], handlerId: string, eventType: T) => React.ReactNode; const dispatchers: {[T in keyof TypeInfo]?: RendererEvent} = { }; function registerRenderer(key: T, builder: RendererEvent) { dispatchers[key] = builder as any; } export function findLogEventRenderer(type: T) : RendererEvent { return dispatchers[type] as any; } export function getRegisteredLogEventRenderer() : TypeInfo[] { return Object.keys(dispatchers) as any; } const ClientRenderer = (props: { client: EventClient, handlerId: string, braces?: boolean }) => ( ); const ChannelRenderer = (props: { channel: EventChannelData, handlerId: string, braces?: boolean }) => ( ); registerRenderer(EventType.ERROR_CUSTOM, data =>
{data.message}
); registerRenderer(EventType.CONNECTION_BEGIN, data => ( <>{data.address.server_hostname} <>{data.address.server_port == 9987 ? "" : (":" + data.address.server_port)} )); registerRenderer(EventType.CONNECTION_HOSTNAME_RESOLVE, () => ( Resolving hostname )); registerRenderer(EventType.CONNECTION_HOSTNAME_RESOLVED, data => ( <>{data.address.server_hostname} <>{data.address.server_port} )); registerRenderer(EventType.CONNECTION_HOSTNAME_RESOLVE_ERROR, data => ( <>{data.message} )); registerRenderer(EventType.CONNECTION_LOGIN, () => ( Logging in... )); registerRenderer(EventType.CONNECTION_FAILED, () => ( Connect failed. )); registerRenderer(EventType.CONNECTION_CONNECTED, (data,handlerId) => ( )); registerRenderer(EventType.CONNECTION_VOICE_CONNECT, () => ( Connecting voice bridge. )); registerRenderer(EventType.CONNECTION_VOICE_CONNECT_SUCCEEDED, () => ( Voice bridge successfully connected. )); registerRenderer(EventType.CONNECTION_VOICE_CONNECT_FAILED, (data) => ( <>{data.reason} {data.reconnect_delay > 0 ? Yes : No} )); registerRenderer(EventType.CONNECTION_VOICE_DROPPED, () => ( Voice bridge has been dropped. Trying to reconnect. )); registerRenderer(EventType.ERROR_PERMISSION, data => (
<>{data.permission ? data.permission.name : unknown}
)); registerRenderer(EventType.CLIENT_VIEW_ENTER, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_USER_ACTION: if(data.channel_from) { return ( ); } else { return ( ); } case ViewReasonId.VREASON_MOVED: if(data.channel_from) { return ( ); } else { return ( ); } case ViewReasonId.VREASON_CHANNEL_KICK: if(data.channel_from) { return ( <>{data.message ? " (" + data.message + ")" : ""} ); } else { return ( <>{data.message ? " (" + data.message + ")" : ""} ); } case ViewReasonId.VREASON_SYSTEM: return undefined; default: return (
<>{data.reason}
); } }); registerRenderer(EventType.CLIENT_VIEW_ENTER_OWN_CHANNEL, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_USER_ACTION: if(data.channel_from) { return ( ); } else { return ( ); } case ViewReasonId.VREASON_MOVED: if(data.channel_from) { return ( ); } else { return ( ); } case ViewReasonId.VREASON_CHANNEL_KICK: if(data.channel_from) { return ( <>{data.message ? " (" + data.message + ")" : ""} ); } else { return ( <>{data.message ? " (" + data.message + ")" : ""} ); } case ViewReasonId.VREASON_SYSTEM: return undefined; default: return (
<>{data.reason}
); } }); registerRenderer(EventType.CLIENT_VIEW_MOVE, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_MOVED: return ( ); case ViewReasonId.VREASON_USER_ACTION: return ( ); case ViewReasonId.VREASON_CHANNEL_KICK: return ( <>{data.message ? " (" + data.message + ")" : ""} ); default: return (
<>{data.reason}
); } }); registerRenderer(EventType.CLIENT_VIEW_MOVE_OWN_CHANNEL, findLogEventRenderer(EventType.CLIENT_VIEW_MOVE)); registerRenderer(EventType.CLIENT_VIEW_MOVE_OWN, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_MOVED: return ( ); case ViewReasonId.VREASON_USER_ACTION: return ( ); case ViewReasonId.VREASON_CHANNEL_KICK: return ( <>{data.message ? " (" + data.message + ")" : ""} ); default: return (
<>{data.reason}
); } }); registerRenderer(EventType.CLIENT_VIEW_LEAVE, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_USER_ACTION: return ( ); case ViewReasonId.VREASON_SERVER_LEFT: return ( <>{data.message ? " (" + data.message + ")" : ""} ); case ViewReasonId.VREASON_SERVER_KICK: return ( <>{data.message ? " (" + data.message + ")" : ""} ); case ViewReasonId.VREASON_CHANNEL_KICK: return ( <>{data.message ? " (" + data.message + ")" : ""} ); case ViewReasonId.VREASON_BAN: let duration = permanently; if(data.ban_time) duration = <>{" " + formatDate(data.ban_time)}; return ( {duration} <>{data.message ? " (" + data.message + ")" : ""} ); case ViewReasonId.VREASON_TIMEOUT: return ( <>{data.message ? " (" + data.message + ")" : ""} ); case ViewReasonId.VREASON_MOVED: return ( ); default: return (
<>{data.reason}
); } }); registerRenderer(EventType.CLIENT_VIEW_LEAVE_OWN_CHANNEL, (data, handlerId) => { switch (data.reason) { case ViewReasonId.VREASON_USER_ACTION: return ( ); case ViewReasonId.VREASON_MOVED: return ( ); default: return findLogEventRenderer(EventType.CLIENT_VIEW_LEAVE)(data, handlerId, EventType.CLIENT_VIEW_LEAVE); } }); registerRenderer(EventType.SERVER_WELCOME_MESSAGE,(data, handlerId) => ( )); registerRenderer(EventType.SERVER_HOST_MESSAGE,(data, handlerId) => ( )); registerRenderer(EventType.SERVER_HOST_MESSAGE_DISCONNECT,(data, handlerId) => ( )); registerRenderer(EventType.CLIENT_NICKNAME_CHANGED,(data, handlerId) => ( <>{data.old_name} <>{data.new_name} )); registerRenderer(EventType.CLIENT_NICKNAME_CHANGED_OWN,() => ( Nickname successfully changed. )); registerRenderer(EventType.CLIENT_NICKNAME_CHANGE_FAILED,(data) => ( <>{data.reason} )); registerRenderer(EventType.GLOBAL_MESSAGE, (data, handlerId) => <> ); registerRenderer(EventType.DISCONNECTED,() => ( Disconnected from server )); registerRenderer(EventType.RECONNECT_SCHEDULED,data => ( <>{format_time(data.timeout, tr("now"))} )); registerRenderer(EventType.RECONNECT_CANCELED,() => ( Reconnect canceled. )); registerRenderer(EventType.RECONNECT_CANCELED,() => ( Reconnecting... )); registerRenderer(EventType.SERVER_BANNED,(data, handlerId) => { const time = data.time === 0 ? ever : <>{format_time(data.time * 1000, tr("one second"))}; const reason = data.message ? <> Reason: {data.message} : undefined; if(data.invoker.client_id > 0) return (
{time} {reason}
); else return (
{time} {reason}
); }); registerRenderer(EventType.SERVER_REQUIRES_PASSWORD,() => ( Server requires a password to connect. )); registerRenderer(EventType.SERVER_CLOSED,data => { if(data.message) return ( <>{data.message} ); return Server has been closed.; }); registerRenderer(EventType.CONNECTION_COMMAND_ERROR,data => { let message; if(typeof data.error === "string") message = data.error; else if(data.error instanceof CommandResult) message = data.error.formattedMessage(); else message = data.error + ""; return (
<>{message}
) }); registerRenderer(EventType.CHANNEL_CREATE,(data, handlerId) => { if(data.ownAction) { return ( ); } else { return ( ); } }); registerRenderer("channel.show",(data, handlerId) => ( )); registerRenderer(EventType.CHANNEL_DELETE,(data, handlerId) => { if(data.ownAction) { return ( ); } else { return ( ); } }); registerRenderer("channel.hide",(data, handlerId) => ( )); registerRenderer(EventType.CLIENT_POKE_SEND,(data, handlerId) => ( )); registerRenderer(EventType.CLIENT_POKE_RECEIVED,(data, handlerId) => { if(data.message) { return ( ); } else { return ( ); } }); registerRenderer(EventType.PRIVATE_MESSAGE_RECEIVED, () => undefined); registerRenderer(EventType.PRIVATE_MESSAGE_SEND, () => undefined); registerRenderer(EventType.WEBRTC_FATAL_ERROR, (data) => { if(data.retryTimeout) { let time = Math.ceil(data.retryTimeout / 1000); let minutes = Math.floor(time / 60); let seconds = time % 60; return (
<>{data.message} <>{(minutes > 0 ? minutes + "m" : "") + seconds + "s"}
); } else { return (
<>{data.message}
); } });