Directly importing logging methods and some general code and logging messages cleanup

This commit is contained in:
WolverinDEV 2021-01-10 17:36:57 +01:00
parent e08f89c4b6
commit 84e907adbb
171 changed files with 726 additions and 787 deletions

View file

@ -4,8 +4,7 @@ import {GroupManager} from "./permission/GroupManager";
import {ServerSettings, Settings, settings, StaticSettings} from "./settings"; import {ServerSettings, Settings, settings, StaticSettings} from "./settings";
import {Sound, SoundManager} from "./sound/Sounds"; import {Sound, SoundManager} from "./sound/Sounds";
import {ConnectionProfile} from "./profiles/ConnectionProfile"; import {ConnectionProfile} from "./profiles/ConnectionProfile";
import * as log from "./log"; import {LogCategory, logError, logInfo, logTrace, logWarn} from "./log";
import {LogCategory, logError, logInfo, logWarn} from "./log";
import {createErrorModal, createInfoModal, createInputModal, Modal} from "./ui/elements/Modal"; import {createErrorModal, createInfoModal, createInputModal, Modal} from "./ui/elements/Modal";
import {hashPassword} from "./utils/helpers"; import {hashPassword} from "./utils/helpers";
import {HandshakeHandler} from "./connection/HandshakeHandler"; import {HandshakeHandler} from "./connection/HandshakeHandler";
@ -375,7 +374,7 @@ export class ConnectionHandler {
try { try {
await this.serverConnection.disconnect(); await this.serverConnection.disconnect();
} catch (error) { } catch (error) {
log.warn(LogCategory.CLIENT, tr("Failed to successfully disconnect from server: {}"), error); logWarn(LogCategory.CLIENT, tr("Failed to successfully disconnect from server: {}"), error);
} }
this.sound.play(Sound.CONNECTION_DISCONNECTED); this.sound.play(Sound.CONNECTION_DISCONNECTED);
this.log.log("disconnected", {}); this.log.log("disconnected", {});
@ -525,7 +524,7 @@ export class ConnectionHandler {
} }
break; break;
case DisconnectReason.DNS_FAILED: case DisconnectReason.DNS_FAILED:
log.error(LogCategory.CLIENT, tr("Failed to resolve hostname: %o"), data); logError(LogCategory.CLIENT, tr("Failed to resolve hostname: %o"), data);
this.log.log("connection.hostname.resolve.error", { this.log.log("connection.hostname.resolve.error", {
message: data as any message: data as any
}); });
@ -538,9 +537,9 @@ export class ConnectionHandler {
} }
if(data) { if(data) {
log.error(LogCategory.CLIENT, tr("Could not connect to remote host! Extra data: %o"), data); logError(LogCategory.CLIENT, tr("Could not connect to remote host! Extra data: %o"), data);
} else { } else {
log.error(LogCategory.CLIENT, tr("Could not connect to remote host!"), data); logError(LogCategory.CLIENT, tr("Could not connect to remote host!"), data);
} }
if(__build.target === "client" || !dns.resolve_address_ipv4) { if(__build.target === "client" || !dns.resolve_address_ipv4) {
@ -583,7 +582,7 @@ export class ConnectionHandler {
break; break;
case DisconnectReason.HANDSHAKE_FAILED: case DisconnectReason.HANDSHAKE_FAILED:
//TODO sound //TODO sound
log.error(LogCategory.CLIENT, tr("Failed to process handshake: %o"), data); logError(LogCategory.CLIENT, tr("Failed to process handshake: %o"), data);
createErrorModal( createErrorModal(
tr("Could not connect"), tr("Could not connect"),
tr("Failed to process handshake: ") + data as string tr("Failed to process handshake: ") + data as string
@ -607,7 +606,7 @@ export class ConnectionHandler {
autoReconnect = false; autoReconnect = false;
break; break;
case DisconnectReason.CONNECTION_CLOSED: case DisconnectReason.CONNECTION_CLOSED:
log.error(LogCategory.CLIENT, tr("Lost connection to remote server!")); logError(LogCategory.CLIENT, tr("Lost connection to remote server!"));
if(!this.autoReconnectAttempt) { if(!this.autoReconnectAttempt) {
createErrorModal( createErrorModal(
tr("Connection closed"), tr("Connection closed"),
@ -619,7 +618,7 @@ export class ConnectionHandler {
autoReconnect = true; autoReconnect = true;
break; break;
case DisconnectReason.CONNECTION_PING_TIMEOUT: case DisconnectReason.CONNECTION_PING_TIMEOUT:
log.error(LogCategory.CLIENT, tr("Connection ping timeout")); logError(LogCategory.CLIENT, tr("Connection ping timeout"));
this.sound.play(Sound.CONNECTION_DISCONNECTED_TIMEOUT); this.sound.play(Sound.CONNECTION_DISCONNECTED_TIMEOUT);
createErrorModal( createErrorModal(
tr("Connection lost"), tr("Connection lost"),
@ -699,8 +698,8 @@ export class ConnectionHandler {
this.sound.play(Sound.CONNECTION_BANNED); this.sound.play(Sound.CONNECTION_BANNED);
break; break;
default: default:
log.error(LogCategory.CLIENT, tr("Got uncaught disconnect!")); logError(LogCategory.CLIENT, tr("Got uncaught disconnect!"));
log.error(LogCategory.CLIENT, tr("Type: %o Data: %o"), type, data); logError(LogCategory.CLIENT, tr("Type: %o Data: %o"), type, data);
break; break;
} }
@ -747,7 +746,7 @@ export class ConnectionHandler {
} }
private on_connection_state_changed(old_state: ConnectionState, new_state: ConnectionState) { private on_connection_state_changed(old_state: ConnectionState, new_state: ConnectionState) {
console.log("From %s to %s", ConnectionState[old_state], ConnectionState[new_state]); logTrace(LogCategory.CLIENT, tr("From %s to %s"), ConnectionState[old_state], ConnectionState[new_state]);
this.events_.fire("notify_connection_state_changed", { this.events_.fire("notify_connection_state_changed", {
oldState: old_state, oldState: old_state,
newState: new_state newState: new_state
@ -834,7 +833,7 @@ export class ConnectionHandler {
this.clientStatusSync = true; this.clientStatusSync = true;
this.serverConnection.send_command("clientupdate", localClientUpdates).catch(error => { this.serverConnection.send_command("clientupdate", localClientUpdates).catch(error => {
log.warn(LogCategory.GENERAL, tr("Failed to update client audio hardware properties. Error: %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to update client audio hardware properties. Error: %o"), error);
this.log.log("error.custom", { message: tr("Failed to update audio hardware properties.") }); this.log.log("error.custom", { message: tr("Failed to update audio hardware properties.") });
this.clientStatusSync = false; this.clientStatusSync = false;
}); });
@ -880,7 +879,7 @@ export class ConnectionHandler {
//client_input_hardware: this.client_status.sound_record_supported && this.getInputHardwareState() === InputHardwareState.VALID, //client_input_hardware: this.client_status.sound_record_supported && this.getInputHardwareState() === InputHardwareState.VALID,
//client_output_hardware: this.client_status.sound_playback_supported //client_output_hardware: this.client_status.sound_playback_supported
}).catch(error => { }).catch(error => {
log.warn(LogCategory.GENERAL, tr("Failed to sync handler state with server. Error: %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to sync handler state with server. Error: %o"), error);
this.log.log("error.custom", {message: tr("Failed to sync handler state with server.")}); this.log.log("error.custom", {message: tr("Failed to sync handler state with server.")});
}); });
} }
@ -990,7 +989,7 @@ export class ConnectionHandler {
}).then(() => { }).then(() => {
createInfoModal(tr("Avatar deleted"), tr("Avatar successfully deleted")).open(); createInfoModal(tr("Avatar deleted"), tr("Avatar successfully deleted")).open();
}).catch(error => { }).catch(error => {
log.error(LogCategory.GENERAL, tr("Failed to reset avatar flag: %o"), error); logError(LogCategory.GENERAL, tr("Failed to reset avatar flag: %o"), error);
let message; let message;
if(error instanceof CommandResult) { if(error instanceof CommandResult) {
@ -1021,7 +1020,7 @@ export class ConnectionHandler {
if(transfer.transferState() !== FileTransferState.FINISHED) { if(transfer.transferState() !== FileTransferState.FINISHED) {
if(transfer.transferState() === FileTransferState.ERRORED) { if(transfer.transferState() === FileTransferState.ERRORED) {
log.warn(LogCategory.FILE_TRANSFER, tr("Failed to upload clients avatar: %o"), transfer.currentError()); logWarn(LogCategory.FILE_TRANSFER, tr("Failed to upload clients avatar: %o"), transfer.currentError());
createErrorModal(tr("Failed to upload avatar"), traj("Failed to upload avatar:{:br:}{0}", transfer.currentErrorMessage())).open(); createErrorModal(tr("Failed to upload avatar"), traj("Failed to upload avatar:{:br:}{0}", transfer.currentErrorMessage())).open();
return; return;
} else if(transfer.transferState() === FileTransferState.CANCELED) { } else if(transfer.transferState() === FileTransferState.CANCELED) {
@ -1038,7 +1037,7 @@ export class ConnectionHandler {
client_flag_avatar: md5(new Uint8Array(data)) client_flag_avatar: md5(new Uint8Array(data))
}); });
} catch(error) { } catch(error) {
log.error(LogCategory.GENERAL, tr("Failed to update avatar flag: %o"), error); logError(LogCategory.GENERAL, tr("Failed to update avatar flag: %o"), error);
let message; let message;
if(error instanceof CommandResult) if(error instanceof CommandResult)
@ -1217,7 +1216,7 @@ export class ConnectionHandler {
client_away: typeof(this.client_status.away) === "string" || this.client_status.away, client_away: typeof(this.client_status.away) === "string" || this.client_status.away,
client_away_message: typeof(this.client_status.away) === "string" ? this.client_status.away : "", client_away_message: typeof(this.client_status.away) === "string" ? this.client_status.away : "",
}).catch(error => { }).catch(error => {
log.warn(LogCategory.GENERAL, tr("Failed to update away status. Error: %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to update away status. Error: %o"), error);
this.log.log("error.custom", {message: tr("Failed to update away status.")}); this.log.log("error.custom", {message: tr("Failed to update away status.")});
}); });

View file

@ -1,6 +1,6 @@
import * as ppt from "tc-backend/ppt"; import * as ppt from "tc-backend/ppt";
import * as log from "./log"; import * as log from "./log";
import {LogCategory, logWarn} from "./log"; import {LogCategory, logError, logWarn} from "./log";
import {KeyDescriptor, KeyHook} from "./PPTListener"; import {KeyDescriptor, KeyHook} from "./PPTListener";
import {Settings, settings} from "./settings"; import {Settings, settings} from "./settings";
import {server_connections} from "tc-shared/ConnectionManager"; import {server_connections} from "tc-shared/ConnectionManager";
@ -137,7 +137,7 @@ export function initializeKeyControl() {
try { try {
cfg = JSON.parse(settings.getValue(Settings.KEY_KEYCONTROL_DATA)); cfg = JSON.parse(settings.getValue(Settings.KEY_KEYCONTROL_DATA));
} catch (e) { } catch (e) {
log.error(LogCategory.GENERAL, tr("Failed to parse old key control data.")); logError(LogCategory.GENERAL, tr("Failed to parse old key control data."));
cfg = {}; cfg = {};
} }

View file

@ -1,5 +1,4 @@
import * as log from "./log"; import {LogCategory, logError} from "./log";
import {LogCategory} from "./log";
import {guid} from "./crypto/uid"; import {guid} from "./crypto/uid";
import {createErrorModal, createInfoModal, createInputModal} from "./ui/elements/Modal"; import {createErrorModal, createInfoModal, createInputModal} from "./ui/elements/Modal";
import {defaultConnectProfile, findConnectProfile} from "./profiles/ConnectionProfile"; import {defaultConnectProfile, findConnectProfile} from "./profiles/ConnectionProfile";
@ -99,7 +98,7 @@ function bookmark_config() : BookmarkConfig {
try { try {
bookmarks = JSON.parse(bookmark_json) || {} as BookmarkConfig; bookmarks = JSON.parse(bookmark_json) || {} as BookmarkConfig;
} catch(error) { } catch(error) {
log.error(LogCategory.BOOKMARKS, tr("Failed to load bookmarks: %o"), error); logError(LogCategory.BOOKMARKS, tr("Failed to load bookmarks: %o"), error);
bookmarks = {} as any; bookmarks = {} as any;
} }

View file

@ -1,9 +1,6 @@
import { import {AbstractServerConnection, ServerCommand, SingleCommandHandler} from "../connection/ConnectionBase";
AbstractServerConnection,
ServerCommand,
SingleCommandHandler
} from "../connection/ConnectionBase";
import {tr} from "../i18n/localize"; import {tr} from "../i18n/localize";
import {LogCategory, logError, logWarn} from "tc-shared/log";
export abstract class AbstractCommandHandler { export abstract class AbstractCommandHandler {
readonly connection: AbstractServerConnection; readonly connection: AbstractServerConnection;
@ -67,7 +64,7 @@ export abstract class AbstractCommandHandlerBoss {
unregister_handler(handler: AbstractCommandHandler) { unregister_handler(handler: AbstractCommandHandler) {
if(!handler.volatile_handler_boss && handler.handler_boss !== this) { if(!handler.volatile_handler_boss && handler.handler_boss !== this) {
console.warn(tr("Tried to unregister command handler which does not belong to the handler boss")); logWarn(LogCategory.NETWORKING, tr("Tried to unregister command handler which does not belong to the handler boss"));
return; return;
} }
@ -98,7 +95,7 @@ export abstract class AbstractCommandHandlerBoss {
if(!flag_consumed || handler.ignore_consumed) if(!flag_consumed || handler.ignore_consumed)
flag_consumed = handler.handle_command(command) || flag_consumed; flag_consumed = handler.handle_command(command) || flag_consumed;
} catch(error) { } catch(error) {
console.error(tr("Failed to invoke command handler. Invocation results in an exception: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to invoke command handler. Invocation results in an exception: %o"), error);
} }
} }
@ -108,7 +105,7 @@ export abstract class AbstractCommandHandlerBoss {
try { try {
flag_consumed = handler(command, flag_consumed) || flag_consumed; flag_consumed = handler(command, flag_consumed) || flag_consumed;
} catch(error) { } catch(error) {
console.error(tr("Failed to invoke command handler. Invocation results in an exception: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to invoke command handler. Invocation results in an exception: %o"), error);
} }
} }
} }
@ -122,7 +119,7 @@ export abstract class AbstractCommandHandlerBoss {
if(handler.function(command)) if(handler.function(command))
this.single_command_handler.remove(handler); this.single_command_handler.remove(handler);
} catch(error) { } catch(error) {
console.error(tr("Failed to invoke single command handler. Invocation results in an exception: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to invoke single command handler. Invocation results in an exception: %o"), error);
} }
} }

View file

@ -1,5 +1,4 @@
import * as log from "../log"; import {LogCategory, logError, logInfo, logWarn} from "../log";
import {LogCategory, logError, logWarn} from "../log";
import {AbstractServerConnection, CommandOptions, ServerCommand} from "../connection/ConnectionBase"; import {AbstractServerConnection, CommandOptions, ServerCommand} from "../connection/ConnectionBase";
import {Sound} from "../sound/Sounds"; import {Sound} from "../sound/Sounds";
import {CommandResult} from "../connection/ServerConnectionDeclaration"; import {CommandResult} from "../connection/ServerConnectionDeclaration";
@ -125,7 +124,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
} else if(typeof(ex) === "string") { } else if(typeof(ex) === "string") {
this.connection_handler.log.log("connection.command.error", {error: ex}); this.connection_handler.log.log("connection.command.error", {error: ex});
} else { } else {
log.error(LogCategory.NETWORKING, tr("Invalid promise result type: %s. Result: %o"), typeof (ex), ex); logError(LogCategory.NETWORKING, tr("Invalid promise result type: %s. Result: %o"), typeof (ex), ex);
} }
} }
@ -160,7 +159,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
handleCommandResult(json) { handleCommandResult(json) {
let code : string = json[0]["return_code"]; let code : string = json[0]["return_code"];
if(!code || code.length == 0) { if(!code || code.length == 0) {
log.warn(LogCategory.NETWORKING, tr("Invalid return code! (%o)"), json); logWarn(LogCategory.NETWORKING, tr("Invalid return code! (%o)"), json);
return; return;
} }
let retListeners = this.connection["_retListener"] || this.connection["returnListeners"]; let retListeners = this.connection["_retListener"] || this.connection["returnListeners"];
@ -278,7 +277,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
const client = this.connection_handler.channelTree.findClient(parseInt(json["clid"])); const client = this.connection_handler.channelTree.findClient(parseInt(json["clid"]));
if(!client) { if(!client) {
log.warn(LogCategory.NETWORKING, tr("Received client connection info for unknown client (%o)"), json["clid"]); logWarn(LogCategory.NETWORKING, tr("Received client connection info for unknown client (%o)"), json["clid"]);
return; return;
} }
@ -410,7 +409,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let playSound = false; let playSound = false;
log.info(LogCategory.NETWORKING, tr("Got %d channel deletions"), json.length); logInfo(LogCategory.NETWORKING, tr("Got %d channel deletions"), json.length);
for(let index = 0; index < json.length; index++) { for(let index = 0; index < json.length; index++) {
conversations.destroyConversation(parseInt(json[index]["cid"])); conversations.destroyConversation(parseInt(json[index]["cid"]));
let channel = tree.findChannel(json[index]["cid"]); let channel = tree.findChannel(json[index]["cid"]);
@ -442,7 +441,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
handleCommandChannelHide(json) { handleCommandChannelHide(json) {
let tree = this.connection.client.channelTree; let tree = this.connection.client.channelTree;
log.info(LogCategory.NETWORKING, tr("Got %d channel hides"), json.length); logInfo(LogCategory.NETWORKING, tr("Got %d channel hides"), json.length);
for(let index = 0; index < json.length; index++) { for(let index = 0; index < json.length; index++) {
let channel = tree.findChannel(json[index]["cid"]); let channel = tree.findChannel(json[index]["cid"]);
if(!channel) { if(!channel) {
@ -471,6 +470,12 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
for(const entry of json) { for(const entry of json) {
/* attempt to update properties if given */ /* attempt to update properties if given */
channel = typeof(entry["ctid"]) !== "undefined" ? tree.findChannel(parseInt(entry["ctid"])) : channel; channel = typeof(entry["ctid"]) !== "undefined" ? tree.findChannel(parseInt(entry["ctid"])) : channel;
if(!channel) {
/* TODO: Close the connection */
logError(LogCategory.NETWORKING, tr("Received client enter view for invalid target channel: %o"), entry["ctid"]);
continue;
}
old_channel = typeof(entry["cfid"]) !== "undefined" ? tree.findChannel(parseInt(entry["cfid"])) : old_channel; old_channel = typeof(entry["cfid"]) !== "undefined" ? tree.findChannel(parseInt(entry["cfid"])) : old_channel;
reasonId = typeof(entry["reasonid"]) !== "undefined" ? entry["reasonid"] : reasonId; reasonId = typeof(entry["reasonid"]) !== "undefined" ? entry["reasonid"] : reasonId;
reasonMsg = typeof(entry["reason_msg"]) !== "undefined" ? entry["reason_msg"] : reasonMsg; reasonMsg = typeof(entry["reason_msg"]) !== "undefined" ? entry["reason_msg"] : reasonMsg;
@ -522,7 +527,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
} else if(reasonId == ViewReasonId.VREASON_SYSTEM) { } else if(reasonId == ViewReasonId.VREASON_SYSTEM) {
} else { } else {
console.warn(tr("Unknown reasonid for %o"), reasonId); logWarn(LogCategory.NETWORKING, tr("Unknown reasonid for %o"), reasonId);
} }
} }
@ -560,7 +565,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let tree = this.connection.client.channelTree; let tree = this.connection.client.channelTree;
let client = tree.findClient(entry["clid"]); let client = tree.findClient(entry["clid"]);
if(!client) { if(!client) {
log.error(LogCategory.NETWORKING, tr("Unknown client left!")); logError(LogCategory.NETWORKING, tr("Unknown client left!"));
return 0; return 0;
} }
if(client == this.connection.client.getClient()) { if(client == this.connection.client.getClient()) {
@ -611,7 +616,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
} else if(reason_id == ViewReasonId.VREASON_MOVED) { } else if(reason_id == ViewReasonId.VREASON_MOVED) {
this.connection_handler.sound.play(Sound.USER_LEFT_MOVED); this.connection_handler.sound.play(Sound.USER_LEFT_MOVED);
} else { } else {
log.error(LogCategory.NETWORKING, tr("Unknown client left reason %d!"), reason_id); logError(LogCategory.NETWORKING, tr("Unknown client left reason %d!"), reason_id);
} }
} }
} }
@ -630,21 +635,21 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let channelFrom = tree.findChannel(parseInt(json["cfid"])); let channelFrom = tree.findChannel(parseInt(json["cfid"]));
if(!client) { if(!client) {
log.error(LogCategory.NETWORKING, tr("Unknown client move (Client)!")); logError(LogCategory.NETWORKING, tr("Unknown client move (Client)!"));
return 0; return 0;
} }
if(!channel_to) { if(!channel_to) {
log.error(LogCategory.NETWORKING, tr("Unknown client move (Channel to)!")); logError(LogCategory.NETWORKING, tr("Unknown client move (Channel to)!"));
return 0; return 0;
} }
if(!self) { if(!self) {
if(!channelFrom) { if(!channelFrom) {
log.error(LogCategory.NETWORKING, tr("Unknown client move (Channel from)!")); logError(LogCategory.NETWORKING, tr("Unknown client move (Channel from)!"));
channelFrom = client.currentChannel(); channelFrom = client.currentChannel();
} else if(channelFrom != client.currentChannel()) { } else if(channelFrom != client.currentChannel()) {
log.error(LogCategory.NETWORKING, logError(LogCategory.NETWORKING,
tr("Client move from invalid source channel! Local client registered in channel %d but server send %d."), tr("Client move from invalid source channel! Local client registered in channel %d but server send %d."),
client.currentChannel().channelId, channelFrom.channelId client.currentChannel().channelId, channelFrom.channelId
); );
@ -713,7 +718,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
else if(own_channel == channelFrom) else if(own_channel == channelFrom)
this.connection_handler.sound.play(Sound.USER_LEFT_KICKED_CHANNEL); this.connection_handler.sound.play(Sound.USER_LEFT_KICKED_CHANNEL);
} else { } else {
console.warn(tr("Unknown reason id %o"), json["reasonid"]); logWarn(LogCategory.NETWORKING, tr("Unknown reason id %o"), json["reasonid"]);
} }
} }
@ -723,19 +728,19 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let tree = this.connection.client.channelTree; let tree = this.connection.client.channelTree;
let channel = tree.findChannel(json["cid"]); let channel = tree.findChannel(json["cid"]);
if(!channel) { if(!channel) {
log.error(LogCategory.NETWORKING, tr("Unknown channel move (Channel)!")); logError(LogCategory.NETWORKING, tr("Unknown channel move (Channel)!"));
return 0; return 0;
} }
let prev = tree.findChannel(json["order"]); let prev = tree.findChannel(json["order"]);
if(!prev && json["order"] != 0) { if(!prev && json["order"] != 0) {
log.error(LogCategory.NETWORKING, tr("Unknown channel move (prev)!")); logError(LogCategory.NETWORKING, tr("Unknown channel move (prev)!"));
return 0; return 0;
} }
let parent = tree.findChannel(json["cpid"]); let parent = tree.findChannel(json["cpid"]);
if(!parent && json["cpid"] != 0) { if(!parent && json["cpid"] != 0) {
log.error(LogCategory.NETWORKING, tr("Unknown channel move (parent)!")); logError(LogCategory.NETWORKING, tr("Unknown channel move (parent)!"));
return 0; return 0;
} }
@ -748,7 +753,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let tree = this.connection.client.channelTree; let tree = this.connection.client.channelTree;
let channel = tree.findChannel(json["cid"]); let channel = tree.findChannel(json["cid"]);
if(!channel) { if(!channel) {
log.error(LogCategory.NETWORKING, tr("Unknown channel edit (Channel)!")); logError(LogCategory.NETWORKING, tr("Unknown channel edit (Channel)!"));
return 0; return 0;
} }
@ -797,7 +802,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
const targetIsOwn = targetClientEntry instanceof LocalClientEntry; const targetIsOwn = targetClientEntry instanceof LocalClientEntry;
if(targetIsOwn && targetClientId === invokerClientId) { if(targetIsOwn && targetClientId === invokerClientId) {
log.error(LogCategory.NETWORKING, tr("Received conversation message from our self. This should be impossible."), json); logError(LogCategory.NETWORKING, tr("Received conversation message from our self. This should be impossible."), json);
return; return;
} }
@ -899,7 +904,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
const conversationManager = this.connection_handler.getPrivateConversations(); const conversationManager = this.connection_handler.getPrivateConversations();
const conversation = conversationManager.findConversation(json["cluid"]); const conversation = conversationManager.findConversation(json["cluid"]);
if(!conversation) { if(!conversation) {
log.warn(LogCategory.GENERAL, tr("Received chat close for client, but we haven't a chat open.")); logWarn(LogCategory.GENERAL, tr("Received chat close for client, but we haven't a chat open."));
return; return;
} }
@ -911,7 +916,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let client = this.connection.client.channelTree.findClient(json["clid"]); let client = this.connection.client.channelTree.findClient(json["clid"]);
if(!client) { if(!client) {
log.error(LogCategory.NETWORKING, tr("Tried to update an non existing client")); logError(LogCategory.NETWORKING, tr("Tried to update an non existing client"));
return; return;
} }
@ -968,7 +973,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
let bot = this.connection.client.channelTree.find_client_by_dbid(json["bot_id"]); let bot = this.connection.client.channelTree.find_client_by_dbid(json["bot_id"]);
if(!bot || !(bot instanceof MusicClientEntry)) { if(!bot || !(bot instanceof MusicClientEntry)) {
log.warn(LogCategory.CLIENT, tr("Got music player info for unknown or invalid bot! (ID: %i, Entry: %o)"), json["bot_id"], bot); logWarn(LogCategory.CLIENT, tr("Got music player info for unknown or invalid bot! (ID: %i, Entry: %o)"), json["bot_id"], bot);
return; return;
} }
@ -1026,7 +1031,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
for(const entry of json) { for(const entry of json) {
const channel = this.connection.client.channelTree.findChannel(parseInt(entry["cid"])); const channel = this.connection.client.channelTree.findChannel(parseInt(entry["cid"]));
if(!channel) { if(!channel) {
console.warn(tr("Received channel subscribed for not visible channel (cid: %d)"), entry['cid']); logWarn(LogCategory.NETWORKING, tr("Received channel subscribed for not visible channel (cid: %o)"), entry["cid"]);
continue; continue;
} }
@ -1041,7 +1046,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
for(const entry of json) { for(const entry of json) {
const channel = this.connection.client.channelTree.findChannel(entry["cid"]); const channel = this.connection.client.channelTree.findChannel(entry["cid"]);
if(!channel) { if(!channel) {
console.warn(tr("Received channel unsubscribed for not visible channel (cid: %d)"), entry['cid']); logWarn(LogCategory.NETWORKING, tr("Received channel unsubscribed for not visible channel (cid: %o)"), entry["cid"]);
continue; continue;
} }
@ -1058,7 +1063,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
const bot_id = parseInt(json["bot_id"]); const bot_id = parseInt(json["bot_id"]);
const client = this.connection.client.channelTree.find_client_by_dbid(bot_id); const client = this.connection.client.channelTree.find_client_by_dbid(bot_id);
if(!client || !(client instanceof MusicClientEntry)) { if(!client || !(client instanceof MusicClientEntry)) {
log.warn(LogCategory.CLIENT, tr("Received music bot status update for unknown bot (%d)"), bot_id); logWarn(LogCategory.CLIENT, tr("Received music bot status update for unknown bot (%d)"), bot_id);
return; return;
} }
@ -1074,7 +1079,7 @@ export class ConnectionCommandHandler extends AbstractCommandHandler {
const bot_id = parseInt(json["bot_id"]); const bot_id = parseInt(json["bot_id"]);
const client = this.connection.client.channelTree.find_client_by_dbid(bot_id); const client = this.connection.client.channelTree.find_client_by_dbid(bot_id);
if(!client || !(client instanceof MusicClientEntry)) { if(!client || !(client instanceof MusicClientEntry)) {
log.warn(LogCategory.CLIENT, tr("Received music bot status update for unknown bot (%d)"), bot_id); logWarn(LogCategory.CLIENT, tr("Received music bot status update for unknown bot (%d)"), bot_id);
return; return;
} }

View file

@ -1,6 +1,5 @@
import {ServerCommand, SingleCommandHandler} from "../connection/ConnectionBase"; import {ServerCommand, SingleCommandHandler} from "../connection/ConnectionBase";
import * as log from "../log"; import {LogCategory, logError} from "../log";
import {LogCategory} from "../log";
import { import {
ClientNameInfo, ClientNameInfo,
CommandResult, CommandResult,
@ -221,7 +220,7 @@ export class CommandHelper extends AbstractCommandHandler {
needed_power_song_remove: parseInt(entry["needed_power_song_remove"]) needed_power_song_remove: parseInt(entry["needed_power_song_remove"])
}); });
} catch(error) { } catch(error) {
log.error(LogCategory.NETWORKING, tr("Failed to parse playlist entry: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to parse playlist entry: %o"), error);
} }
} }
@ -281,7 +280,7 @@ export class CommandHelper extends AbstractCommandHandler {
song_metadata: entry["song_metadata"] song_metadata: entry["song_metadata"]
}); });
} catch(error) { } catch(error) {
log.error(LogCategory.NETWORKING, tr("Failed to parse playlist song entry: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to parse playlist song entry: %o"), error);
} }
} }
@ -319,7 +318,7 @@ export class CommandHelper extends AbstractCommandHandler {
const json = command.arguments; const json = command.arguments;
if(json[0]["playlist_id"] != playlist_id) { if(json[0]["playlist_id"] != playlist_id) {
log.error(LogCategory.NETWORKING, tr("Received invalid notification for playlist clients")); logError(LogCategory.NETWORKING, tr("Received invalid notification for playlist clients"));
return false; return false;
} }
@ -355,7 +354,7 @@ export class CommandHelper extends AbstractCommandHandler {
command: "notifyservergroupclientlist", command: "notifyservergroupclientlist",
function: command => { function: command => {
if (command.arguments[0]["sgid"] != group_id) { if (command.arguments[0]["sgid"] != group_id) {
log.error(LogCategory.NETWORKING, tr("Received invalid notification for server group client list")); logError(LogCategory.NETWORKING, tr("Received invalid notification for server group client list"));
return false; return false;
} }
@ -372,7 +371,7 @@ export class CommandHelper extends AbstractCommandHandler {
} }
resolve(result); resolve(result);
} catch (error) { } catch (error) {
log.error(LogCategory.NETWORKING, tr("Failed to parse server group client list: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to parse server group client list: %o"), error);
reject("failed to parse info"); reject("failed to parse info");
} }
@ -394,7 +393,7 @@ export class CommandHelper extends AbstractCommandHandler {
function: command => { function: command => {
const json = command.arguments[0]; const json = command.arguments[0];
if (json["playlist_id"] != playlist_id) { if (json["playlist_id"] != playlist_id) {
log.error(LogCategory.NETWORKING, tr("Received invalid notification for playlist info")); logError(LogCategory.NETWORKING, tr("Received invalid notification for playlist info"));
return; return;
} }
@ -416,7 +415,7 @@ export class CommandHelper extends AbstractCommandHandler {
playlist_max_songs: parseInt(json["playlist_max_songs"]) playlist_max_songs: parseInt(json["playlist_max_songs"])
}); });
} catch (error) { } catch (error) {
log.error(LogCategory.NETWORKING, tr("Failed to parse playlist info: %o"), error); logError(LogCategory.NETWORKING, tr("Failed to parse playlist info: %o"), error);
reject("failed to parse info"); reject("failed to parse info");
} }

View file

@ -1,7 +1,6 @@
import {AbstractServerConnection, ServerCommand, ServerConnectionEvents} from "tc-shared/connection/ConnectionBase"; import {AbstractServerConnection, ServerCommand, ServerConnectionEvents} from "tc-shared/connection/ConnectionBase";
import {ConnectionState} from "tc-shared/ConnectionHandler"; import {ConnectionState} from "tc-shared/ConnectionHandler";
import * as log from "tc-shared/log"; import {LogCategory, logDebug, logError, logGroupNative, logTrace, LogType, logWarn} from "tc-shared/log";
import {group, LogCategory, logDebug, logError, logGroupNative, logTrace, LogType, logWarn} from "tc-shared/log";
import {AbstractCommandHandler} from "tc-shared/connection/AbstractCommandHandler"; import {AbstractCommandHandler} from "tc-shared/connection/AbstractCommandHandler";
import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration"; import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration";
import {tr, tra} from "tc-shared/i18n/localize"; import {tr, tra} from "tc-shared/i18n/localize";
@ -307,8 +306,6 @@ class CommandHandler extends AbstractCommandHandler {
} else { } else {
logWarn(LogCategory.WEBRTC, tr("Received unknown/invalid rtc track state: %d"), state); logWarn(LogCategory.WEBRTC, tr("Received unknown/invalid rtc track state: %d"), state);
} }
} else if(command.command === "notifybroadcastvideo") {
/* FIXME: TODO! */
} }
return false; return false;
} }
@ -920,9 +917,6 @@ export class RTCConnection {
this.peer.ondatachannel = event => this.handleDataChannel(event.channel); this.peer.ondatachannel = event => this.handleDataChannel(event.channel);
this.peer.ontrack = event => this.handleTrack(event); this.peer.ontrack = event => this.handleTrack(event);
/* FIXME: Remove this debug! */
(window as any).rtp = this;
this.updateConnectionState(RTPConnectionState.CONNECTING); this.updateConnectionState(RTPConnectionState.CONNECTING);
this.doInitialSetup0().catch(error => { this.doInitialSetup0().catch(error => {
this.handleFatalError(tr("initial setup failed"), true); this.handleFatalError(tr("initial setup failed"), true);
@ -959,7 +953,7 @@ export class RTCConnection {
/* Firefox has some crazy issues */ /* Firefox has some crazy issues */
if(window.detectedBrowser.name !== "firefox") { if(window.detectedBrowser.name !== "firefox") {
if(target) { if(target) {
console.error("Setting sendrecv from %o", this.currentTransceiver[type].direction, this.currentTransceiver[type].currentDirection); logTrace(LogCategory.NETWORKING, "Setting sendrecv from %o", this.currentTransceiver[type].direction, this.currentTransceiver[type].currentDirection);
this.currentTransceiver[type].direction = "sendrecv"; this.currentTransceiver[type].direction = "sendrecv";
} else if(type === "video" || type === "video-screen") { } else if(type === "video" || type === "video-screen") {
/* /*
@ -1046,7 +1040,6 @@ export class RTCConnection {
private handleLocalIceCandidate(candidate: RTCIceCandidate | undefined) { private handleLocalIceCandidate(candidate: RTCIceCandidate | undefined) {
if(candidate) { if(candidate) {
console.error(candidate.candidate);
if(candidate.address?.endsWith(".local")) { if(candidate.address?.endsWith(".local")) {
logTrace(LogCategory.WEBRTC, tr("Skipping local fqdn ICE candidate %s"), candidate.toJSON().candidate); logTrace(LogCategory.WEBRTC, tr("Skipping local fqdn ICE candidate %s"), candidate.toJSON().candidate);
return; return;
@ -1109,18 +1102,18 @@ export class RTCConnection {
private handleIceCandidateError(event: RTCPeerConnectionIceErrorEvent) { private handleIceCandidateError(event: RTCPeerConnectionIceErrorEvent) {
if(this.peer.iceGatheringState === "gathering") { if(this.peer.iceGatheringState === "gathering") {
log.warn(LogCategory.WEBRTC, tr("Received error while gathering the ice candidates: %d/%s for %s (url: %s)"), logWarn(LogCategory.WEBRTC, tr("Received error while gathering the ice candidates: %d/%s for %s (url: %s)"),
event.errorCode, event.errorText, event.hostCandidate, event.url); event.errorCode, event.errorText, event.hostCandidate, event.url);
} else { } else {
log.trace(LogCategory.WEBRTC, tr("Ice candidate %s (%s) errored: %d/%s"), logTrace(LogCategory.WEBRTC, tr("Ice candidate %s (%s) errored: %d/%s"),
event.url, event.hostCandidate, event.errorCode, event.errorText); event.url, event.hostCandidate, event.errorCode, event.errorText);
} }
} }
private handleIceConnectionStateChanged() { private handleIceConnectionStateChanged() {
log.trace(LogCategory.WEBRTC, tr("ICE connection state changed to %s"), this.peer.iceConnectionState); logTrace(LogCategory.WEBRTC, tr("ICE connection state changed to %s"), this.peer.iceConnectionState);
} }
private handleIceGatheringStateChanged() { private handleIceGatheringStateChanged() {
log.trace(LogCategory.WEBRTC, tr("ICE gathering state changed to %s"), this.peer.iceGatheringState); logTrace(LogCategory.WEBRTC, tr("ICE gathering state changed to %s"), this.peer.iceGatheringState);
} }
private handleSignallingStateChanged() { private handleSignallingStateChanged() {

View file

@ -218,7 +218,6 @@ function generateSdp(session: RTCNegotiationMessage) {
generateMedia(session.ssrc[index], flags); generateMedia(session.ssrc[index], flags);
} }
console.error(JSON.stringify(session));
return sdpTransform.write(sdp); return sdpTransform.write(sdp);
} }
@ -243,7 +242,7 @@ export class RTCNegotiator {
} }
} }
/* FIXME: mozilla...THIS_IS_SDPARTA-82.0.3 (Needs to be parsed from the offer) */ /* TODO: mozilla...THIS_IS_SDPARTA-82.0.3 (Needs to be parsed from the offer) */
/* /*
console.error("XYX\n%s", console.error("XYX\n%s",
generateSdp({ generateSdp({

View file

@ -1,5 +1,5 @@
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {LogCategory, logWarn} from "tc-shared/log"; import {LogCategory, logTrace, logWarn} from "tc-shared/log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
import {globalAudioContext, on_ready} from "tc-backend/audio/player"; import {globalAudioContext, on_ready} from "tc-backend/audio/player";
@ -104,10 +104,10 @@ export class RemoteRTPVideoTrack extends RemoteRTPTrack {
this.mediaStream.addTrack(transceiver.receiver.track); this.mediaStream.addTrack(transceiver.receiver.track);
const track = transceiver.receiver.track; const track = transceiver.receiver.track;
track.onended = () => console.error("TRACK %d ended", ssrc); track.onended = () => logTrace(LogCategory.VIDEO, "Track %d ended", ssrc);
track.onmute = () => console.error("TRACK %d muted", ssrc); track.onmute = () => logTrace(LogCategory.VIDEO, "Track %d muted", ssrc);
track.onunmute = () => console.error("TRACK %d unmuted", ssrc); track.onunmute = () => logTrace(LogCategory.VIDEO, "Track %d unmuted", ssrc);
track.onisolationchange = () => console.error("TRACK %d onisolationchange", ssrc); track.onisolationchange = () => logTrace(LogCategory.VIDEO, "Track %d isolation changed", ssrc);
} }
getMediaStream() : MediaStream { getMediaStream() : MediaStream {

View file

@ -1,8 +1,8 @@
import { import {
VideoBroadcastConfig,
LocalVideoBroadcast, LocalVideoBroadcast,
LocalVideoBroadcastEvents, LocalVideoBroadcastEvents,
LocalVideoBroadcastState, LocalVideoBroadcastState,
VideoBroadcastConfig,
VideoBroadcastStatistics, VideoBroadcastStatistics,
VideoBroadcastType, VideoBroadcastType,
VideoClient, VideoClient,
@ -13,7 +13,7 @@ import {
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {VideoSource} from "tc-shared/video/VideoSource"; import {VideoSource} from "tc-shared/video/VideoSource";
import {RTCBroadcastableTrackType, RTCConnection, RTCConnectionEvents, RTPConnectionState} from "../Connection"; import {RTCBroadcastableTrackType, RTCConnection, RTCConnectionEvents, RTPConnectionState} from "../Connection";
import {LogCategory, logError, logWarn} from "tc-shared/log"; import {LogCategory, logError, logTrace, logWarn} from "tc-shared/log";
import {Settings, settings} from "tc-shared/settings"; import {Settings, settings} from "tc-shared/settings";
import {RtpVideoClient} from "./VideoClient"; import {RtpVideoClient} from "./VideoClient";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -77,7 +77,7 @@ class LocalRtpVideoBroadcast implements LocalVideoBroadcast {
let sourceRef = source.ref(); let sourceRef = source.ref();
try { try {
if(this.currentSource !== source) { if(this.currentSource !== source) {
console.error("Source changed"); logTrace(LogCategory.VIDEO, tr("Video broadcast %s source changed"), this.type);
const videoTracks = source.getStream().getVideoTracks(); const videoTracks = source.getStream().getVideoTracks();
if(videoTracks.length === 0) { if(videoTracks.length === 0) {
throw tr("missing video stream track"); throw tr("missing video stream track");
@ -110,7 +110,7 @@ class LocalRtpVideoBroadcast implements LocalVideoBroadcast {
this.setCurrentSource(sourceRef); this.setCurrentSource(sourceRef);
} else if(!_.isEqual(this.currentConfig, constraints)) { } else if(!_.isEqual(this.currentConfig, constraints)) {
console.error("Constraints changed"); logTrace(LogCategory.VIDEO, tr("Video broadcast %s constraints changed"), this.type);
await this.applyConstraints(constraints); await this.applyConstraints(constraints);
} }
} finally { } finally {

View file

@ -2,14 +2,14 @@ import * as loader from "tc-loader";
import {Stage} from "tc-loader"; import {Stage} from "tc-loader";
import {server_connections} from "tc-shared/ConnectionManager"; import {server_connections} from "tc-shared/ConnectionManager";
import {getIconManager} from "tc-shared/file/Icons"; import {getIconManager} from "tc-shared/file/Icons";
import { tra, tr } from "tc-shared/i18n/localize"; import {tr, tra} from "tc-shared/i18n/localize";
import {EventClient, EventServerAddress, EventType, TypeInfo} from "tc-shared/connectionlog/Definitions"; import {EventClient, EventServerAddress, EventType, TypeInfo} from "tc-shared/connectionlog/Definitions";
import {Settings, settings} from "tc-shared/settings"; import {Settings, settings} from "tc-shared/settings";
import {format_time} from "tc-shared/ui/frames/chat"; import {format_time} from "tc-shared/ui/frames/chat";
import {ViewReasonId} from "tc-shared/ConnectionHandler"; import {ViewReasonId} from "tc-shared/ConnectionHandler";
import {formatDate} from "tc-shared/MessageFormatter"; import {formatDate} from "tc-shared/MessageFormatter";
import {renderBBCodeAsText} from "tc-shared/text/bbcode"; import {renderBBCodeAsText} from "tc-shared/text/bbcode";
import {LogCategory, logInfo} from "tc-shared/log"; import {LogCategory, logInfo, logTrace} from "tc-shared/log";
export type DispatcherLog<T extends keyof TypeInfo> = (data: TypeInfo[T], handlerId: string, eventType: T) => void; export type DispatcherLog<T extends keyof TypeInfo> = (data: TypeInfo[T], handlerId: string, eventType: T) => void;
@ -77,7 +77,7 @@ function spawnNotification(title: string, options: NotificationOptions) {
try { try {
new Notification(title, options); new Notification(title, options);
} catch (error) { } catch (error) {
console.error(error); logTrace(LogCategory.GENERAL, tr("Failed to spawn notification: %o"), error);
} }
} }
} }

View file

@ -176,7 +176,7 @@ async function doOpenDatabase(forceUpgrade: boolean) {
}; };
openRequest.onerror = () => { openRequest.onerror = () => {
console.error("Private conversation history opening error: %o", openRequest.error); logWarn(LogCategory.CHAT, tr("Private conversation history opening error: %o"), openRequest.error);
reject(openRequest.error.message); reject(openRequest.error.message);
}; };

View file

@ -1,5 +1,4 @@
import * as log from "./log"; import {LogCategory, logTrace, logWarn} from "./log";
import {LogCategory} from "./log";
import {guid} from "./crypto/uid"; import {guid} from "./crypto/uid";
import * as React from "react"; import * as React from "react";
import {useEffect} from "react"; import {useEffect} from "react";
@ -181,7 +180,7 @@ export class Registry<Events extends { [key: string]: any } = { [key: string]: a
fire<T extends keyof Events>(event_type: T, data?: Events[T], overrideTypeKey?: boolean) { fire<T extends keyof Events>(event_type: T, data?: Events[T], overrideTypeKey?: boolean) {
if(this.debugPrefix) if(this.debugPrefix)
log.trace(LogCategory.EVENT_REGISTRY, tr("[%s] Trigger event: %s"), this.debugPrefix, event_type); logTrace(LogCategory.EVENT_REGISTRY, tr("[%s] Trigger event: %s"), this.debugPrefix, event_type);
if(typeof data === "object" && 'type' in data && !overrideTypeKey) { if(typeof data === "object" && 'type' in data && !overrideTypeKey) {
if((data as any).type !== event_type) { if((data as any).type !== event_type) {
@ -222,7 +221,7 @@ export class Registry<Events extends { [key: string]: any } = { [key: string]: a
invokeCount++; invokeCount++;
} }
if(this.warnUnhandledEvents && invokeCount === 0) { if(this.warnUnhandledEvents && invokeCount === 0) {
log.warn(LogCategory.EVENT_REGISTRY, tr("Event handler (%s) triggered event %s which has no consumers."), this.debugPrefix, type); logWarn(LogCategory.EVENT_REGISTRY, tr("Event handler (%s) triggered event %s which has no consumers."), this.debugPrefix, type);
} }
} }
@ -328,7 +327,7 @@ export class Registry<Events extends { [key: string]: any } = { [key: string]: a
break; break;
} while ((currentPrototype = Object.getPrototypeOf(currentPrototype))); } while ((currentPrototype = Object.getPrototypeOf(currentPrototype)));
if(Object.keys(registered_events).length === 0) { if(Object.keys(registered_events).length === 0) {
log.warn(LogCategory.EVENT_REGISTRY, tr("No events found in event handler which has been registered.")); logWarn(LogCategory.EVENT_REGISTRY, tr("No events found in event handler which has been registered."));
return; return;
} }

View file

@ -55,7 +55,7 @@ export function initialize(event_registry: Registry<ClientGlobalControlEvents>)
event_registry.on("action_open_window", event => { event_registry.on("action_open_window", event => {
const handle_import_error = error => { const handle_import_error = error => {
console.error("Failed to import script: %o", error); logError(LogCategory.GENERAL, tr("Failed to import script: %o"), error);
createErrorModal(tr("Failed to load window"), tr("Failed to load the bookmark window.\nSee the console for more details.")).open(); createErrorModal(tr("Failed to load window"), tr("Failed to load the bookmark window.\nSee the console for more details.")).open();
}; };
@ -136,7 +136,6 @@ export function initialize(event_registry: Registry<ClientGlobalControlEvents>)
}).then(() => { }).then(() => {
createInfoModal(tr("Use token"), tr("Toke successfully used!")).open(); createInfoModal(tr("Use token"), tr("Toke successfully used!")).open();
}).catch(error => { }).catch(error => {
//TODO tr
createErrorModal(tr("Use token"), formatMessage(tr("Failed to use token: {}"), error instanceof CommandResult ? error.message : error)).open(); createErrorModal(tr("Use token"), formatMessage(tr("Failed to use token: {}"), error instanceof CommandResult ? error.message : error)).open();
}); });
}).open(); }).open();
@ -166,7 +165,7 @@ export function initialize(event_registry: Registry<ClientGlobalControlEvents>)
break; break;
default: default:
console.warn(tr("Received open window event for an unknown window: %s"), event.window); logWarn(LogCategory.GENERAL, tr("Received open window event for an unknown window: %s"), event.window);
} }
}); });
@ -199,7 +198,6 @@ export function initialize(event_registry: Registry<ClientGlobalControlEvents>)
try { try {
const broadcast = connection.getServerConnection().getVideoConnection().getLocalBroadcast(event.broadcastType); const broadcast = connection.getServerConnection().getVideoConnection().getLocalBroadcast(event.broadcastType);
if(broadcast.getState().state === "initializing" || broadcast.getState().state === "broadcasting") { if(broadcast.getState().state === "initializing" || broadcast.getState().state === "broadcasting") {
console.error("Change source");
broadcast.changeSource(source, config).catch(error => { broadcast.changeSource(source, config).catch(error => {
logError(LogCategory.VIDEO, tr("Failed to change broadcast source: %o"), event.broadcastType, error); logError(LogCategory.VIDEO, tr("Failed to change broadcast source: %o"), event.broadcastType, error);
if(typeof error !== "string") { if(typeof error !== "string") {
@ -213,7 +211,6 @@ export function initialize(event_registry: Registry<ClientGlobalControlEvents>)
} }
}); });
} else { } else {
console.error("Start broadcast");
broadcast.startBroadcasting(source, config).catch(error => { broadcast.startBroadcasting(source, config).catch(error => {
logError(LogCategory.VIDEO, tr("Failed to start %s broadcasting: %o"), event.broadcastType, error); logError(LogCategory.VIDEO, tr("Failed to start %s broadcasting: %o"), event.broadcastType, error);
if(typeof error !== "string") { if(typeof error !== "string") {

View file

@ -1,5 +1,4 @@
import * as log from "tc-shared/log"; import {LogCategory, logError, logWarn} from "tc-shared/log";
import {LogCategory} from "tc-shared/log";
import {ConnectionHandler} from "tc-shared/ConnectionHandler"; import {ConnectionHandler} from "tc-shared/ConnectionHandler";
import {ServerCommand} from "tc-shared/connection/ConnectionBase"; import {ServerCommand} from "tc-shared/connection/ConnectionBase";
import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration"; import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration";
@ -172,7 +171,7 @@ class FileCommandHandler extends AbstractCommandHandler {
const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])); const transfer = this.manager.findTransfer(parseInt(data["clientftfid"]));
if(!transfer) { if(!transfer) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]);
return; return;
} }
@ -213,7 +212,7 @@ class FileCommandHandler extends AbstractCommandHandler {
const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer; const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer;
if(!transfer) { if(!transfer) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]);
return; return;
} }
@ -243,7 +242,7 @@ class FileCommandHandler extends AbstractCommandHandler {
const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer; const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer;
if(!transfer) { if(!transfer) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file transfer start notification for unknown transfer (%s)"), data["clientftfid"]);
return; return;
} }
@ -258,7 +257,7 @@ class FileCommandHandler extends AbstractCommandHandler {
const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer; const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer;
if(!transfer) { if(!transfer) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file transfer progress notification for unknown transfer (%s)"), data["clientftfid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file transfer progress notification for unknown transfer (%s)"), data["clientftfid"]);
return; return;
} }
@ -283,7 +282,7 @@ class FileCommandHandler extends AbstractCommandHandler {
const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer; const transfer = this.manager.findTransfer(parseInt(data["clientftfid"])) as FileUploadTransfer;
if(!transfer) { if(!transfer) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file transfer status notification for unknown transfer (%s)"), data["clientftfid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file transfer status notification for unknown transfer (%s)"), data["clientftfid"]);
return; return;
} }
@ -308,7 +307,7 @@ class FileCommandHandler extends AbstractCommandHandler {
private handleNotifyFileList(data: any[]) { private handleNotifyFileList(data: any[]) {
const query = this.pendingFileLists.find(e => e.path === data[0]["path"] && (e.channelId === parseInt(data[0]["cid"]) || e.channelId === undefined && !data[0]["cid"])); const query = this.pendingFileLists.find(e => e.path === data[0]["path"] && (e.channelId === parseInt(data[0]["cid"]) || e.channelId === undefined && !data[0]["cid"]));
if(!query) { if(!query) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file list for not request path: %s (channel %s)"), data[0]["path"], data[0]["cid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file list for not request path: %s (channel %s)"), data[0]["path"], data[0]["cid"]);
return; return;
} }
@ -326,7 +325,7 @@ class FileCommandHandler extends AbstractCommandHandler {
private handleNotifyFileListFinished(data) { private handleNotifyFileListFinished(data) {
const query = this.pendingFileLists.find(e => e.path === data[0]["path"] && (e.channelId === parseInt(data[0]["cid"]) || e.channelId === undefined && !data[0]["cid"])); const query = this.pendingFileLists.find(e => e.path === data[0]["path"] && (e.channelId === parseInt(data[0]["cid"]) || e.channelId === undefined && !data[0]["cid"]));
if(!query) { if(!query) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file list finish for not request path: %s (channel %s)"), data[0]["path"], data[0]["cid"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file list finish for not request path: %s (channel %s)"), data[0]["path"], data[0]["cid"]);
return; return;
} }
@ -336,11 +335,11 @@ class FileCommandHandler extends AbstractCommandHandler {
private handleNotifyFileInfo(data: any[]) { private handleNotifyFileInfo(data: any[]) {
const query = this.pendingFileInfos.find(e => e.returnCode === data[0]["return_code"]); const query = this.pendingFileInfos.find(e => e.returnCode === data[0]["return_code"]);
if(!query) { if(!query) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file info for unknown return code: %s"), data[0]["return_code"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file info for unknown return code: %s"), data[0]["return_code"]);
return; return;
} }
if(query.finished) { if(query.finished) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file info for already finished return code: %s"), data[0]["return_code"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file info for already finished return code: %s"), data[0]["return_code"]);
return; return;
} }
@ -358,7 +357,7 @@ class FileCommandHandler extends AbstractCommandHandler {
private handleNotifyFileInfoFinished(data) { private handleNotifyFileInfoFinished(data) {
const query = this.pendingFileInfos.find(e => e.returnCode === data[0]["return_code"]); const query = this.pendingFileInfos.find(e => e.returnCode === data[0]["return_code"]);
if(!query) { if(!query) {
log.warn(LogCategory.FILE_TRANSFER, tr("Received file info for unknown return code: %s"), data[0]["return_code"]); logWarn(LogCategory.FILE_TRANSFER, tr("Received file info for unknown return code: %s"), data[0]["return_code"]);
return; return;
} }
@ -656,7 +655,7 @@ export class FileManager {
const index = this.registeredTransfers_.findIndex(e => e.transfer === transfer); const index = this.registeredTransfers_.findIndex(e => e.transfer === transfer);
if(index === -1) { if(index === -1) {
log.error(LogCategory.FILE_TRANSFER, tr("Missing file transfer in file transfer list!")); logError(LogCategory.FILE_TRANSFER, tr("Missing file transfer in file transfer list!"));
return; return;
} else { } else {
this.registeredTransfers_.splice(index, 1); this.registeredTransfers_.splice(index, 1);
@ -680,7 +679,7 @@ export class FileManager {
transferErrorMessage: transfer.currentErrorMessage(), transferErrorMessage: transfer.currentErrorMessage(),
}); });
} else { } else {
log.warn(LogCategory.FILE_TRANSFER, tra("File transfer finished callback called with invalid transfer state ({0})", FileTransferState[state])); logWarn(LogCategory.FILE_TRANSFER, tra("File transfer finished callback called with invalid transfer state ({0})", FileTransferState[state]));
} }
}; };

View file

@ -1,5 +1,5 @@
import {tr} from "../i18n/localize"; import {tr} from "../i18n/localize";
import {LogCategory, logDebug} from "tc-shared/log"; import {LogCategory, logDebug, logWarn} from "tc-shared/log";
export enum ImageType { export enum ImageType {
UNKNOWN, UNKNOWN,
@ -169,7 +169,7 @@ export class ImageCache {
ignoreSearch: true ignoreSearch: true
}); });
if(!flag) { if(!flag) {
console.warn(tr("Failed to delete key %s from cache!"), key); logWarn(LogCategory.FILE_TRANSFER, tr("Failed to delete key %s from cache!"), key);
} }
} }
} }

View file

@ -1,5 +1,4 @@
import * as log from "../log"; import {LogCategory, logDebug, logError, logInfo, logWarn} from "../log";
import {LogCategory} from "../log";
import * as ipc from "../ipc/BrowserIPC"; import * as ipc from "../ipc/BrowserIPC";
import {ChannelMessage} from "../ipc/BrowserIPC"; import {ChannelMessage} from "../ipc/BrowserIPC";
import * as loader from "tc-loader"; import * as loader from "tc-loader";
@ -58,7 +57,7 @@ export class AvatarManager extends AbstractAvatarManager {
} }
create_avatar_download(client_avatar_id: string) : FileDownloadTransfer { create_avatar_download(client_avatar_id: string) : FileDownloadTransfer {
log.debug(LogCategory.GENERAL, "Requesting download for avatar %s", client_avatar_id); logDebug(LogCategory.GENERAL, "Requesting download for avatar %s", client_avatar_id);
return this.handle.initializeFileDownload({ return this.handle.initializeFileDownload({
path: "", path: "",
@ -86,11 +85,11 @@ export class AvatarManager extends AbstractAvatarManager {
let cachedAvatarHash = response.headers.has("X-avatar-version") ? response.headers.get("X-avatar-version") : undefined; let cachedAvatarHash = response.headers.has("X-avatar-version") ? response.headers.get("X-avatar-version") : undefined;
if(avatar.getAvatarHash() !== "unknown") { if(avatar.getAvatarHash() !== "unknown") {
if(cachedAvatarHash === undefined) { if(cachedAvatarHash === undefined) {
log.debug(LogCategory.FILE_TRANSFER, tr("Invalidating cached avatar for %s (Version miss match. Cached: unset, Current: %s)"), avatar.clientAvatarId, avatar.getAvatarHash()); logDebug(LogCategory.FILE_TRANSFER, tr("Invalidating cached avatar for %s (Version miss match. Cached: unset, Current: %s)"), avatar.clientAvatarId, avatar.getAvatarHash());
await localAvatarCache.delete('avatar_' + avatar.clientAvatarId); await localAvatarCache.delete('avatar_' + avatar.clientAvatarId);
break cache_lookup; break cache_lookup;
} else if(cachedAvatarHash !== avatar.getAvatarHash()) { } else if(cachedAvatarHash !== avatar.getAvatarHash()) {
log.debug(LogCategory.FILE_TRANSFER, tr("Invalidating cached avatar for %s (Version miss match. Cached: %s, Current: %s)"), avatar.clientAvatarId, cachedAvatarHash, avatar.getAvatarHash()); logDebug(LogCategory.FILE_TRANSFER, tr("Invalidating cached avatar for %s (Version miss match. Cached: %s, Current: %s)"), avatar.clientAvatarId, cachedAvatarHash, avatar.getAvatarHash());
await localAvatarCache.delete('avatar_' + avatar.clientAvatarId); await localAvatarCache.delete('avatar_' + avatar.clientAvatarId);
break cache_lookup; break cache_lookup;
} }
@ -122,7 +121,7 @@ export class AvatarManager extends AbstractAvatarManager {
if(commandResult instanceof CommandResult) { if(commandResult instanceof CommandResult) {
if(commandResult.id === ErrorCode.FILE_NOT_FOUND) { if(commandResult.id === ErrorCode.FILE_NOT_FOUND) {
if(avatar.getAvatarHash() !== initialAvatarHash) { if(avatar.getAvatarHash() !== initialAvatarHash) {
log.debug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash()); logDebug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash());
return; return;
} }
@ -136,7 +135,7 @@ export class AvatarManager extends AbstractAvatarManager {
} }
} }
log.error(LogCategory.CLIENT, tr("Could not request download for avatar %s: %o"), avatar.clientAvatarId, error); logError(LogCategory.CLIENT, tr("Could not request download for avatar %s: %o"), avatar.clientAvatarId, error);
if(error === transfer.currentError()) if(error === transfer.currentError())
throw transfer.currentErrorMessage(); throw transfer.currentErrorMessage();
@ -161,7 +160,7 @@ export class AvatarManager extends AbstractAvatarManager {
const media = imageType2MediaType(type); const media = imageType2MediaType(type);
if(avatar.getAvatarHash() !== initialAvatarHash) { if(avatar.getAvatarHash() !== initialAvatarHash) {
log.debug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash()); logDebug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash());
return; return;
} }
@ -188,7 +187,7 @@ export class AvatarManager extends AbstractAvatarManager {
/* ensure we're still up to date */ /* ensure we're still up to date */
if(avatar.getAvatarHash() !== initialAvatarHash) { if(avatar.getAvatarHash() !== initialAvatarHash) {
log.debug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash()); logDebug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), initialAvatarHash, avatar.getAvatarHash());
return; return;
} }
@ -207,7 +206,7 @@ export class AvatarManager extends AbstractAvatarManager {
avatar.loadingTimestamp = Date.now(); avatar.loadingTimestamp = Date.now();
this.executeAvatarLoad0(avatar).catch(error => { this.executeAvatarLoad0(avatar).catch(error => {
if(avatar.getAvatarHash() !== avatarHash) { if(avatar.getAvatarHash() !== avatarHash) {
log.debug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), avatarHash, avatar.getAvatarHash()); logDebug(LogCategory.GENERAL, tr("Ignoring avatar not found since the avatar itself got updated. Out version: %s, current version: %s"), avatarHash, avatar.getAvatarHash());
return; return;
} }
@ -216,7 +215,7 @@ export class AvatarManager extends AbstractAvatarManager {
} else if(error instanceof Error) { } else if(error instanceof Error) {
avatar.setErrored({ message: error.message }); avatar.setErrored({ message: error.message });
} else { } else {
log.error(LogCategory.FILE_TRANSFER, tr("Failed to load avatar %s (hash: %s): %o"), avatar.clientAvatarId, avatarHash, error); logError(LogCategory.FILE_TRANSFER, tr("Failed to load avatar %s (hash: %s): %o"), avatar.clientAvatarId, avatarHash, error);
avatar.setErrored({ message: tr("lookup the console") }); avatar.setErrored({ message: tr("lookup the console") });
} }
}); });
@ -228,7 +227,7 @@ export class AvatarManager extends AbstractAvatarManager {
if(cached.getAvatarHash() === clientAvatarHash) if(cached.getAvatarHash() === clientAvatarHash)
return; return;
log.info(LogCategory.GENERAL, tr("Deleting cached avatar for client %s. Cached version: %s; New version: %s"), cached.getAvatarHash(), clientAvatarHash); logInfo(LogCategory.GENERAL, tr("Deleting cached avatar for client %s. Cached version: %s; New version: %s"), cached.getAvatarHash(), clientAvatarHash);
} }
const response = await localAvatarCache.resolveCached('avatar_' + clientAvatarId); const response = await localAvatarCache.resolveCached('avatar_' + clientAvatarId);
@ -236,7 +235,7 @@ export class AvatarManager extends AbstractAvatarManager {
let cachedAvatarHash = response.headers.has("X-avatar-version") ? response.headers.get("X-avatar-version") : undefined; let cachedAvatarHash = response.headers.has("X-avatar-version") ? response.headers.get("X-avatar-version") : undefined;
if(cachedAvatarHash !== clientAvatarHash) { if(cachedAvatarHash !== clientAvatarHash) {
await localAvatarCache.delete("avatar_" + clientAvatarId).catch(error => { await localAvatarCache.delete("avatar_" + clientAvatarId).catch(error => {
log.warn(LogCategory.FILE_TRANSFER, tr("Failed to delete avatar %s: %o"), clientAvatarId, error); logWarn(LogCategory.FILE_TRANSFER, tr("Failed to delete avatar %s: %o"), clientAvatarId, error);
}); });
} }
} }

View file

@ -2,7 +2,6 @@ import * as loader from "tc-loader";
import {Stage} from "tc-loader"; import {Stage} from "tc-loader";
import {ImageCache, ImageType, imageType2MediaType, responseImageType} from "tc-shared/file/ImageCache"; import {ImageCache, ImageType, imageType2MediaType, responseImageType} from "tc-shared/file/ImageCache";
import {AbstractIconManager, kIPCIconChannel, RemoteIcon, RemoteIconState, setIconManager} from "tc-shared/file/Icons"; import {AbstractIconManager, kIPCIconChannel, RemoteIcon, RemoteIconState, setIconManager} from "tc-shared/file/Icons";
import * as log from "tc-shared/log";
import {LogCategory, logDebug, logError, logWarn} from "tc-shared/log"; import {LogCategory, logDebug, logError, logWarn} from "tc-shared/log";
import {server_connections} from "tc-shared/ConnectionManager"; import {server_connections} from "tc-shared/ConnectionManager";
import {ConnectionEvents, ConnectionHandler, ConnectionState} from "tc-shared/ConnectionHandler"; import {ConnectionEvents, ConnectionHandler, ConnectionState} from "tc-shared/ConnectionHandler";
@ -292,7 +291,7 @@ class IconManager extends AbstractIconManager {
throw error.extra_message || error.message; throw error.extra_message || error.message;
} }
} }
log.error(LogCategory.FILE_TRANSFER, tr("Could not request download for icon %d: %o"), icon.iconId, error); logError(LogCategory.FILE_TRANSFER, tr("Could not request download for icon %d: %o"), icon.iconId, error);
if(error === transfer.currentError()) { if(error === transfer.currentError()) {
throw transfer.currentErrorMessage(); throw transfer.currentErrorMessage();
} }

View file

@ -1,5 +1,4 @@
import * as log from "../log"; import {LogCategory, logError, logInfo, logWarn} from "../log";
import {LogCategory} from "../log";
import {guid} from "../crypto/uid"; import {guid} from "../crypto/uid";
import {Settings, StaticSettings} from "../settings"; import {Settings, StaticSettings} from "../settings";
import * as loader from "tc-loader"; import * as loader from "tc-loader";
@ -54,7 +53,7 @@ export function tr(message: string, key?: string) {
const sloppy = fast_translate[message]; const sloppy = fast_translate[message];
if(sloppy) return sloppy; if(sloppy) return sloppy;
log.info(LogCategory.I18N, "Translating \"%s\". Default: \"%s\"", key, message); logInfo(LogCategory.I18N, "Translating \"%s\". Default: \"%s\"", key, message);
let translated = message; let translated = message;
for(const translation of translations) { for(const translation of translations) {
@ -116,7 +115,7 @@ async function load_translation_file(url: string, path: string) : Promise<Transl
//TODO: Validate file //TODO: Validate file
resolve(file); resolve(file);
} catch(error) { } catch(error) {
log.warn(LogCategory.I18N, tr("Failed to load translation file %s. Failed to parse or process json: %o"), url, error); logWarn(LogCategory.I18N, tr("Failed to load translation file %s. Failed to parse or process json: %o"), url, error);
reject(tr("Failed to process or parse json!")); reject(tr("Failed to process or parse json!"));
} }
}, },
@ -136,10 +135,10 @@ export function load_file(url: string, path: string) : Promise<void> {
throw "dummy test failed"; throw "dummy test failed";
} }
log.info(LogCategory.I18N, tr("Successfully initialized up translation file from %s"), url); logInfo(LogCategory.I18N, tr("Successfully initialized up translation file from %s"), url);
translations = result.translations; translations = result.translations;
}).catch(error => { }).catch(error => {
log.warn(LogCategory.I18N, tr("Failed to load translation file from \"%s\". Error: %o"), url, error); logWarn(LogCategory.I18N, tr("Failed to load translation file from \"%s\". Error: %o"), url, error);
return Promise.reject(error); return Promise.reject(error);
}); });
} }
@ -210,7 +209,7 @@ export namespace config {
try { try {
config = config_string ? JSON.parse(config_string) : {}; config = config_string ? JSON.parse(config_string) : {};
} catch(error) { } catch(error) {
log.error(LogCategory.I18N, tr("Failed to parse repository config: %o"), error); logError(LogCategory.I18N, tr("Failed to parse repository config: %o"), error);
} }
config.repositories = config.repositories || []; config.repositories = config.repositories || [];
for(const repo of config.repositories) for(const repo of config.repositories)
@ -219,10 +218,10 @@ export namespace config {
if(config.repositories.length == 0) { if(config.repositories.length == 0) {
//Add the default TeaSpeak repository //Add the default TeaSpeak repository
load_repository(StaticSettings.instance.static(Settings.KEY_I18N_DEFAULT_REPOSITORY)).then(repo => { load_repository(StaticSettings.instance.static(Settings.KEY_I18N_DEFAULT_REPOSITORY)).then(repo => {
log.info(LogCategory.I18N, tr("Successfully added default repository from \"%s\"."), repo.url); logInfo(LogCategory.I18N, tr("Successfully added default repository from \"%s\"."), repo.url);
register_repository(repo); register_repository(repo);
}).catch(error => { }).catch(error => {
log.warn(LogCategory.I18N, tr("Failed to add default repository. Error: %o"), error); logWarn(LogCategory.I18N, tr("Failed to add default repository. Error: %o"), error);
}); });
} }
@ -244,7 +243,7 @@ export namespace config {
try { try {
_cached_translation_config = config_string ? JSON.parse(config_string) : {}; _cached_translation_config = config_string ? JSON.parse(config_string) : {};
} catch(error) { } catch(error) {
log.error(LogCategory.I18N, tr("Failed to initialize translation config. Using default one. Error: %o"), error); logError(LogCategory.I18N, tr("Failed to initialize translation config. Using default one. Error: %o"), error);
_cached_translation_config = {} as any; _cached_translation_config = {} as any;
} }
return _cached_translation_config; return _cached_translation_config;
@ -284,7 +283,7 @@ export async function iterate_repositories(callback_entry: (repository: Translat
for(const repository of registered_repositories()) { for(const repository of registered_repositories()) {
promises.push(load_repository0(repository, false).then(() => callback_entry(repository)).catch(error => { promises.push(load_repository0(repository, false).then(() => callback_entry(repository)).catch(error => {
log.warn(LogCategory.I18N, "Failed to fetch repository %s. error: %o", repository.url, error); logWarn(LogCategory.I18N, "Failed to fetch repository %s. error: %o", repository.url, error);
})); }));
} }
@ -318,7 +317,7 @@ export async function initialize() {
try { try {
await load_file(cfg.current_translation_url, cfg.current_translation_path); await load_file(cfg.current_translation_url, cfg.current_translation_path);
} catch (error) { } catch (error) {
console.error(tr("Failed to initialize selected translation: %o"), error); logError(LogCategory.I18N, tr("Failed to initialize selected translation: %o"), error);
const show_error = () => { const show_error = () => {
import("../ui/elements/Modal").then(Modal => { import("../ui/elements/Modal").then(Modal => {
Modal.createErrorModal(tr("Translation System"), tra("Failed to load current selected translation file.{:br:}File: {0}{:br:}Error: {1}{:br:}{:br:}Using default fallback translations.", cfg.current_translation_url, error)).open() Modal.createErrorModal(tr("Translation System"), tra("Failed to load current selected translation file.{:br:}File: {0}{:br:}Error: {1}{:br:}{:br:}Using default fallback translations.", cfg.current_translation_url, error)).open()

View file

@ -1,6 +1,5 @@
import "broadcastchannel-polyfill"; import "broadcastchannel-polyfill";
import * as log from "../log"; import {LogCategory, logDebug, logError, logWarn} from "../log";
import {LogCategory} from "../log";
import {ConnectHandler} from "../ipc/ConnectHandler"; import {ConnectHandler} from "../ipc/ConnectHandler";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -67,7 +66,7 @@ export abstract class BasicIPCHandler {
if(message.receiver === BasicIPCHandler.BROADCAST_UNIQUE_ID) { if(message.receiver === BasicIPCHandler.BROADCAST_UNIQUE_ID) {
if(message.type == "process-query") { if(message.type == "process-query") {
log.debug(LogCategory.IPC, tr("Received a device query from %s."), message.sender); logDebug(LogCategory.IPC, tr("Received a device query from %s."), message.sender);
this.sendMessage("process-query-response", { this.sendMessage("process-query-response", {
request_query_id: (<ProcessQuery>message.data).query_id, request_query_id: (<ProcessQuery>message.data).query_id,
request_timestamp: (<ProcessQuery>message.data).timestamp, request_timestamp: (<ProcessQuery>message.data).timestamp,
@ -83,14 +82,14 @@ export abstract class BasicIPCHandler {
if(this._query_results[response.request_query_id]) if(this._query_results[response.request_query_id])
this._query_results[response.request_query_id].push(response); this._query_results[response.request_query_id].push(response);
else { else {
log.warn(LogCategory.IPC, tr("Received a query response for an unknown request.")); logWarn(LogCategory.IPC, tr("Received a query response for an unknown request."));
} }
return; return;
} }
else if(message.type == "certificate-accept-callback") { else if(message.type == "certificate-accept-callback") {
const data: CertificateAcceptCallback = message.data; const data: CertificateAcceptCallback = message.data;
if(!this._cert_accept_callbacks[data.request_id]) { if(!this._cert_accept_callbacks[data.request_id]) {
log.warn(LogCategory.IPC, tr("Received certificate accept callback for an unknown request ID.")); logWarn(LogCategory.IPC, tr("Received certificate accept callback for an unknown request ID."));
return; return;
} }
this._cert_accept_callbacks[data.request_id](); this._cert_accept_callbacks[data.request_id]();
@ -103,7 +102,7 @@ export abstract class BasicIPCHandler {
} }
else if(message.type == "certificate-accept-succeeded") { else if(message.type == "certificate-accept-succeeded") {
if(!this._cert_accept_succeeded[message.sender]) { if(!this._cert_accept_succeeded[message.sender]) {
log.warn(LogCategory.IPC, tr("Received certificate accept succeeded, but haven't a callback.")); logWarn(LogCategory.IPC, tr("Received certificate accept succeeded, but haven't a callback."));
return; return;
} }
this._cert_accept_succeeded[message.sender](); this._cert_accept_succeeded[message.sender]();
@ -230,7 +229,7 @@ class BroadcastChannelIPC extends BasicIPCHandler {
private onMessage(event: MessageEvent) { private onMessage(event: MessageEvent) {
if(typeof(event.data) !== "string") { if(typeof(event.data) !== "string") {
log.warn(LogCategory.IPC, tr("Received message with an invalid type (%s): %o"), typeof(event.data), event.data); logWarn(LogCategory.IPC, tr("Received message with an invalid type (%s): %o"), typeof(event.data), event.data);
return; return;
} }
@ -238,14 +237,14 @@ class BroadcastChannelIPC extends BasicIPCHandler {
try { try {
message = JSON.parse(event.data); message = JSON.parse(event.data);
} catch(error) { } catch(error) {
log.error(LogCategory.IPC, tr("Received an invalid encoded message: %o"), event.data); logError(LogCategory.IPC, tr("Received an invalid encoded message: %o"), event.data);
return; return;
} }
super.handleMessage(message); super.handleMessage(message);
} }
private onError(event: MessageEvent) { private onError(event: MessageEvent) {
log.warn(LogCategory.IPC, tr("Received error: %o"), event); logWarn(LogCategory.IPC, tr("Received error: %o"), event);
} }
sendMessage(type: string, data: any, target?: string) { sendMessage(type: string, data: any, target?: string) {

View file

@ -1,6 +1,5 @@
import * as log from "../log"; import {LogCategory, logDebug, logError, logWarn} from "../log";
import {LogCategory} from "../log"; import {BasicIPCHandler, ChannelMessage, IPCChannel} from "../ipc/BrowserIPC";
import {BasicIPCHandler, IPCChannel, ChannelMessage} from "../ipc/BrowserIPC";
import {guid} from "../crypto/uid"; import {guid} from "../crypto/uid";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -91,7 +90,7 @@ export class ConnectHandler {
} as ConnectOfferAnswer; } as ConnectOfferAnswer;
if(response.accepted) { if(response.accepted) {
log.debug(LogCategory.IPC, tr("Received new connect offer from %s: %s"), sender, data.request_id); logDebug(LogCategory.IPC, tr("Received new connect offer from %s: %s"), sender, data.request_id);
const ld = { const ld = {
remote_handler: sender, remote_handler: sender,
@ -101,7 +100,7 @@ export class ConnectHandler {
}; };
this._pending_connect_offers.push(ld); this._pending_connect_offers.push(ld);
ld.timeout = setTimeout(() => { ld.timeout = setTimeout(() => {
log.debug(LogCategory.IPC, tr("Dropping connect request %s, because we never received an execute."), ld.id); logDebug(LogCategory.IPC, tr("Dropping connect request %s, because we never received an execute."), ld.id);
this._pending_connect_offers.remove(ld); this._pending_connect_offers.remove(ld);
}, 120 * 1000) as any; }, 120 * 1000) as any;
} }
@ -112,19 +111,19 @@ export class ConnectHandler {
const data = message.data as ConnectOfferAnswer; const data = message.data as ConnectOfferAnswer;
const request = this._pending_connects_requests.find(e => e.id === data.request_id); const request = this._pending_connects_requests.find(e => e.id === data.request_id);
if(!request) { if(!request) {
log.warn(LogCategory.IPC, tr("Received connect offer answer with unknown request id (%s)."), data.request_id); logWarn(LogCategory.IPC, tr("Received connect offer answer with unknown request id (%s)."), data.request_id);
return; return;
} }
if(!data.accepted) { if(!data.accepted) {
log.debug(LogCategory.IPC, tr("Client %s rejected the connect offer (%s)."), sender, request.id); logDebug(LogCategory.IPC, tr("Client %s rejected the connect offer (%s)."), sender, request.id);
return; return;
} }
if(request.remote_handler) { if(request.remote_handler) {
log.debug(LogCategory.IPC, tr("Client %s accepted the connect offer (%s), but offer has already been accepted."), sender, request.id); logDebug(LogCategory.IPC, tr("Client %s accepted the connect offer (%s), but offer has already been accepted."), sender, request.id);
return; return;
} }
log.debug(LogCategory.IPC, tr("Client %s accepted the connect offer (%s). Request local acceptance."), sender, request.id); logDebug(LogCategory.IPC, tr("Client %s accepted the connect offer (%s). Request local acceptance."), sender, request.id);
request.remote_handler = sender; request.remote_handler = sender;
clearTimeout(request.timeout); clearTimeout(request.timeout);
@ -134,7 +133,7 @@ export class ConnectHandler {
return; return;
} }
log.debug(LogCategory.IPC, tr("Executing connect with client %s"), request.remote_handler); logDebug(LogCategory.IPC, tr("Executing connect with client %s"), request.remote_handler);
this.ipc_channel.sendMessage("execute", { this.ipc_channel.sendMessage("execute", {
request_id: request.id request_id: request.id
} as ConnectExecute, request.remote_handler); } as ConnectExecute, request.remote_handler);
@ -142,7 +141,7 @@ export class ConnectHandler {
request.callback_failed("connect execute timeout"); request.callback_failed("connect execute timeout");
}, 1000) as any; }, 1000) as any;
}).catch(error => { }).catch(error => {
log.error(LogCategory.IPC, tr("Local avail callback caused an error: %o"), error); logError(LogCategory.IPC, tr("Local avail callback caused an error: %o"), error);
request.callback_failed(tr("local avail callback caused an error")); request.callback_failed(tr("local avail callback caused an error"));
}); });
@ -151,16 +150,16 @@ export class ConnectHandler {
const data = message.data as ConnectExecuted; const data = message.data as ConnectExecuted;
const request = this._pending_connects_requests.find(e => e.id === data.request_id); const request = this._pending_connects_requests.find(e => e.id === data.request_id);
if(!request) { if(!request) {
log.warn(LogCategory.IPC, tr("Received connect executed with unknown request id (%s)."), data.request_id); logWarn(LogCategory.IPC, tr("Received connect executed with unknown request id (%s)."), data.request_id);
return; return;
} }
if(request.remote_handler != sender) { if(request.remote_handler != sender) {
log.warn(LogCategory.IPC, tr("Received connect executed for request %s, but from wrong client: %s (expected %s)"), data.request_id, sender, request.remote_handler); logWarn(LogCategory.IPC, tr("Received connect executed for request %s, but from wrong client: %s (expected %s)"), data.request_id, sender, request.remote_handler);
return; return;
} }
log.debug(LogCategory.IPC, tr("Received connect executed response from client %s for request %s. Succeeded: %o (%s)"), sender, data.request_id, data.succeeded, data.message); logDebug(LogCategory.IPC, tr("Received connect executed response from client %s for request %s. Succeeded: %o (%s)"), sender, data.request_id, data.succeeded, data.message);
clearTimeout(request.timeout); clearTimeout(request.timeout);
if(data.succeeded) if(data.succeeded)
request.callback_success(); request.callback_success();
@ -171,18 +170,18 @@ export class ConnectHandler {
const data = message.data as ConnectExecute; const data = message.data as ConnectExecute;
const request = this._pending_connect_offers.find(e => e.id === data.request_id); const request = this._pending_connect_offers.find(e => e.id === data.request_id);
if(!request) { if(!request) {
log.warn(LogCategory.IPC, tr("Received connect execute with unknown request id (%s)."), data.request_id); logWarn(LogCategory.IPC, tr("Received connect execute with unknown request id (%s)."), data.request_id);
return; return;
} }
if(request.remote_handler != sender) { if(request.remote_handler != sender) {
log.warn(LogCategory.IPC, tr("Received connect execute for request %s, but from wrong client: %s (expected %s)"), data.request_id, sender, request.remote_handler); logWarn(LogCategory.IPC, tr("Received connect execute for request %s, but from wrong client: %s (expected %s)"), data.request_id, sender, request.remote_handler);
return; return;
} }
clearTimeout(request.timeout); clearTimeout(request.timeout);
this._pending_connect_offers.remove(request); this._pending_connect_offers.remove(request);
log.debug(LogCategory.IPC, tr("Executing connect for %s"), data.request_id); logDebug(LogCategory.IPC, tr("Executing connect for %s"), data.request_id);
const cr = this.callback_execute(request.data); const cr = this.callback_execute(request.data);
const response = { const response = {

View file

@ -1,6 +1,5 @@
import * as log from "../log"; import {LogCategory, logDebug, logInfo, logWarn} from "../log";
import {LogCategory} from "../log"; import {BasicIPCHandler, ChannelMessage, IPCChannel} from "../ipc/BrowserIPC";
import {BasicIPCHandler, IPCChannel, ChannelMessage} from "../ipc/BrowserIPC";
import {guid} from "../crypto/uid"; import {guid} from "../crypto/uid";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -81,10 +80,10 @@ export abstract class MethodProxy {
protected register_method<R>(method: (...args: any[]) => Promise<R> | string) { protected register_method<R>(method: (...args: any[]) => Promise<R> | string) {
let method_name: string; let method_name: string;
if(typeof method === "function") { if(typeof method === "function") {
log.debug(LogCategory.IPC, tr("Registering method proxy for %s"), method.name); logDebug(LogCategory.IPC, tr("Registering method proxy for %s"), method.name);
method_name = method.name; method_name = method.name;
} else { } else {
log.debug(LogCategory.IPC, tr("Registering method proxy for %s"), method); logDebug(LogCategory.IPC, tr("Registering method proxy for %s"), method);
method_name = method; method_name = method;
} }
@ -169,11 +168,11 @@ export abstract class MethodProxy {
} }
try { try {
log.info(LogCategory.IPC, tr("Invoking method %s with arguments: %o"), data.method_name, data.arguments); logInfo(LogCategory.IPC, tr("Invoking method %s with arguments: %o"), data.method_name, data.arguments);
const promise = this[data.method_name](...data.arguments); const promise = this[data.method_name](...data.arguments);
promise.then(result => { promise.then(result => {
log.info(LogCategory.IPC, tr("Result: %o"), result); logInfo(LogCategory.IPC, tr("Result: %o"), result);
this._send_result(data.promise_id, true, result); this._send_result(data.promise_id, true, result);
}).catch(error => { }).catch(error => {
this._send_result(data.promise_id, false, error); this._send_result(data.promise_id, false, error);
@ -186,7 +185,7 @@ export abstract class MethodProxy {
private _handle_result(data: MethodProxyResultData) { private _handle_result(data: MethodProxyResultData) {
if(!this._proxied_callbacks[data.promise_id]) { if(!this._proxied_callbacks[data.promise_id]) {
console.warn(tr("Received proxy method result for unknown promise")); logWarn(LogCategory.IPC, tr("Received proxy method result for unknown promise"));
return; return;
} }
const callback = this._proxied_callbacks[data.promise_id]; const callback = this._proxied_callbacks[data.promise_id];

View file

@ -131,7 +131,7 @@ function logDirect(type: LogType, message: string, ...optionalParams: any[]) {
} }
} }
export function log(type: LogType, category: LogCategory, message: string, ...optionalParams: any[]) { function doLog(type: LogType, category: LogCategory, message: string, ...optionalParams: any[]) {
if(!enabled_mapping.get(category)) return; if(!enabled_mapping.get(category)) return;
optionalParams.unshift(categoryMapping.get(category)); optionalParams.unshift(categoryMapping.get(category));
@ -139,45 +139,25 @@ export function log(type: LogType, category: LogCategory, message: string, ...op
logDirect(type, message, ...optionalParams); logDirect(type, message, ...optionalParams);
} }
export function trace(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.TRACE, category, message, ...optionalParams);
}
export function debug(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.DEBUG, category, message, ...optionalParams);
}
export function info(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.INFO, category, message, ...optionalParams);
}
export function warn(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.WARNING, category, message, ...optionalParams);
}
export function error(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.ERROR, category, message, ...optionalParams);
}
/* methods for direct import */ /* methods for direct import */
export function logTrace(category: LogCategory, message: string, ...optionalParams: any[]) { export function logTrace(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.TRACE, category, message, ...optionalParams); doLog(LogType.TRACE, category, message, ...optionalParams);
} }
export function logDebug(category: LogCategory, message: string, ...optionalParams: any[]) { export function logDebug(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.DEBUG, category, message, ...optionalParams); doLog(LogType.DEBUG, category, message, ...optionalParams);
} }
export function logInfo(category: LogCategory, message: string, ...optionalParams: any[]) { export function logInfo(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.INFO, category, message, ...optionalParams); doLog(LogType.INFO, category, message, ...optionalParams);
} }
export function logWarn(category: LogCategory, message: string, ...optionalParams: any[]) { export function logWarn(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.WARNING, category, message, ...optionalParams); doLog(LogType.WARNING, category, message, ...optionalParams);
} }
export function logError(category: LogCategory, message: string, ...optionalParams: any[]) { export function logError(category: LogCategory, message: string, ...optionalParams: any[]) {
log(LogType.ERROR, category, message, ...optionalParams); doLog(LogType.ERROR, category, message, ...optionalParams);
} }
export function group(level: LogType, category: LogCategory, name: string, ...optionalParams: any[]) : Group { export function group(level: LogType, category: LogCategory, name: string, ...optionalParams: any[]) : Group {

View file

@ -1,5 +1,4 @@
import {InputStartError} from "tc-shared/voice/RecorderBase"; import {InputStartError} from "tc-shared/voice/RecorderBase";
import * as log from "tc-shared/log";
import {LogCategory, logInfo, logWarn} from "tc-shared/log"; import {LogCategory, logInfo, logWarn} from "tc-shared/log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -28,17 +27,17 @@ export async function requestMediaStreamWithConstraints(constraints: MediaTrackC
if('name' in error) { if('name' in error) {
if(error.name === "NotAllowedError") { if(error.name === "NotAllowedError") {
if(Date.now() - beginTimestamp < 250) { if(Date.now() - beginTimestamp < 250) {
log.warn(LogCategory.AUDIO, tr("Media stream request failed (System denied). Browser message: %o"), error.message); logWarn(LogCategory.AUDIO, tr("Media stream request failed (System denied). Browser message: %o"), error.message);
return InputStartError.ESYSTEMDENIED; return InputStartError.ESYSTEMDENIED;
} else { } else {
log.warn(LogCategory.AUDIO, tr("Media stream request failed (No permissions). Browser message: %o"), error.message); logWarn(LogCategory.AUDIO, tr("Media stream request failed (No permissions). Browser message: %o"), error.message);
return InputStartError.ENOTALLOWED; return InputStartError.ENOTALLOWED;
} }
} else { } else {
log.warn(LogCategory.AUDIO, tr("Media stream request failed. Request resulted in error: %o: %o"), error.name, error); logWarn(LogCategory.AUDIO, tr("Media stream request failed. Request resulted in error: %o: %o"), error.name, error);
} }
} else { } else {
log.warn(LogCategory.AUDIO, tr("Failed to initialize media stream (%o)"), error); logWarn(LogCategory.AUDIO, tr("Failed to initialize media stream (%o)"), error);
} }
return InputStartError.EUNKNOWN; return InputStartError.EUNKNOWN;

View file

@ -1,6 +1,5 @@
import {LaterPromise} from "../utils/LaterPromise"; import {LaterPromise} from "../utils/LaterPromise";
import * as log from "../log"; import {LogCategory, logDebug, logError, logWarn} from "../log";
import {LogCategory} from "../log";
import {PermissionManager, PermissionValue} from "../permission/PermissionManager"; import {PermissionManager, PermissionValue} from "../permission/PermissionManager";
import {ServerCommand} from "../connection/ConnectionBase"; import {ServerCommand} from "../connection/ConnectionBase";
import {CommandResult} from "../connection/ServerConnectionDeclaration"; import {CommandResult} from "../connection/ServerConnectionDeclaration";
@ -188,7 +187,7 @@ export class GroupManager extends AbstractCommandHandler {
return; return;
} }
log.debug(LogCategory.PERMISSIONS, tr("Resetting server/channel groups")); logDebug(LogCategory.PERMISSIONS, tr("Resetting server/channel groups"));
this.serverGroups = []; this.serverGroups = [];
this.channelGroups = []; this.channelGroups = [];
this.allGroupsReceived = false; this.allGroupsReceived = false;
@ -219,11 +218,11 @@ export class GroupManager extends AbstractCommandHandler {
requestGroups(){ requestGroups(){
this.connectionHandler.serverConnection.send_command("servergrouplist", {}, { process_result: false }).catch(error => { this.connectionHandler.serverConnection.send_command("servergrouplist", {}, { process_result: false }).catch(error => {
log.warn(LogCategory.PERMISSIONS, tr("Failed to request the server group list: %o"), error); logWarn(LogCategory.PERMISSIONS, tr("Failed to request the server group list: %o"), error);
}); });
this.connectionHandler.serverConnection.send_command("channelgrouplist", {}, { process_result: false }).catch(error => { this.connectionHandler.serverConnection.send_command("channelgrouplist", {}, { process_result: false }).catch(error => {
log.warn(LogCategory.PERMISSIONS, tr("Failed to request the channel group list: %o"), error); logWarn(LogCategory.PERMISSIONS, tr("Failed to request the channel group list: %o"), error);
}); });
} }
@ -257,7 +256,7 @@ export class GroupManager extends AbstractCommandHandler {
case 1: type = GroupType.NORMAL; break; case 1: type = GroupType.NORMAL; break;
case 2: type = GroupType.QUERY; break; case 2: type = GroupType.QUERY; break;
default: default:
log.error(LogCategory.CLIENT, tr("Invalid group type: %o for group %s"), groupData["type"], groupData["name"]); logError(LogCategory.CLIENT, tr("Invalid group type: %o for group %s"), groupData["type"], groupData["name"]);
continue; continue;
} }
@ -332,7 +331,7 @@ export class GroupManager extends AbstractCommandHandler {
private handleGroupPermissionList(json: any[]) { private handleGroupPermissionList(json: any[]) {
let group = json[0]["sgid"] ? this.findServerGroup(parseInt(json[0]["sgid"])) : this.findChannelGroup(parseInt(json[0]["cgid"])); let group = json[0]["sgid"] ? this.findServerGroup(parseInt(json[0]["sgid"])) : this.findChannelGroup(parseInt(json[0]["cgid"]));
if(!group) { if(!group) {
log.error(LogCategory.PERMISSIONS, tr("Got group permissions for group %o/%o, but its not a registered group!"), json[0]["sgid"], json[0]["cgid"]); logError(LogCategory.PERMISSIONS, tr("Got group permissions for group %o/%o, but its not a registered group!"), json[0]["sgid"], json[0]["cgid"]);
return; return;
} }
let requests: GroupPermissionRequest[] = []; let requests: GroupPermissionRequest[] = [];
@ -341,7 +340,7 @@ export class GroupManager extends AbstractCommandHandler {
requests.push(req); requests.push(req);
if(requests.length == 0) { if(requests.length == 0) {
log.warn(LogCategory.PERMISSIONS, tr("Got group permissions for group %o/%o, but it was never requested!"), json[0]["sgid"], json[0]["cgid"]); logWarn(LogCategory.PERMISSIONS, tr("Got group permissions for group %o/%o, but it was never requested!"), json[0]["sgid"], json[0]["cgid"]);
return; return;
} }

View file

@ -1,5 +1,5 @@
import * as log from "../log"; import * as log from "../log";
import {LogCategory, LogType} from "../log"; import {LogCategory, logDebug, logInfo, logTrace, LogType, logWarn} from "../log";
import {PermissionType} from "../permission/PermissionType"; import {PermissionType} from "../permission/PermissionType";
import {LaterPromise} from "../utils/LaterPromise"; import {LaterPromise} from "../utils/LaterPromise";
import {ServerCommand} from "../connection/ConnectionBase"; import {ServerCommand} from "../connection/ConnectionBase";
@ -51,7 +51,7 @@ export class PermissionValue {
let result; let result;
result = this.value == -1 || this.value >= requiredValue || (this.value == -2 && requiredValue == -2 && !required); result = this.value == -1 || this.value >= requiredValue || (this.value == -2 && requiredValue == -2 && !required);
log.trace(LogCategory.PERMISSIONS, logTrace(LogCategory.PERMISSIONS,
tr("Required permission test resulted for permission %s: %s. Required value: %s, Granted value: %s"), tr("Required permission test resulted for permission %s: %s. Required value: %s, Granted value: %s"),
this.type ? this.type.name : "unknown", this.type ? this.type.name : "unknown",
result ? tr("granted") : tr("denied"), result ? tr("granted") : tr("denied"),
@ -227,7 +227,7 @@ export class PermissionManager extends AbstractCommandHandler {
let perm_info = manager.resolveInfo(perm_id); let perm_info = manager.resolveInfo(perm_id);
if(!perm_info) { if(!perm_info) {
log.warn(LogCategory.PERMISSIONS, tr("Got unknown permission id (%o/%o (%o))!"), perm["permid"], perm_id, perm["permsid"]); logWarn(LogCategory.PERMISSIONS, tr("Got unknown permission id (%o/%o (%o))!"), perm["permid"], perm_id, perm["permsid"]);
return; return;
} }
@ -360,7 +360,7 @@ export class PermissionManager extends AbstractCommandHandler {
log.table(LogType.DEBUG, LogCategory.PERMISSIONS, "Permission list", table_entries); log.table(LogType.DEBUG, LogCategory.PERMISSIONS, "Permission list", table_entries);
group.end(); group.end();
log.info(LogCategory.PERMISSIONS, tr("Got %i permissions"), this.permissionList.length); logInfo(LogCategory.PERMISSIONS, tr("Got %i permissions"), this.permissionList.length);
if(this._cacheNeededPermissions) if(this._cacheNeededPermissions)
this.onNeededPermissions(this._cacheNeededPermissions); this.onNeededPermissions(this._cacheNeededPermissions);
for(let listener of this.initializedListener) for(let listener of this.initializedListener)
@ -369,7 +369,7 @@ export class PermissionManager extends AbstractCommandHandler {
private onNeededPermissions(json) { private onNeededPermissions(json) {
if(this.permissionList.length == 0) { if(this.permissionList.length == 0) {
log.warn(LogCategory.PERMISSIONS, tr("Got needed permissions but don't have a permission list!")); logWarn(LogCategory.PERMISSIONS, tr("Got needed permissions but don't have a permission list!"));
this._cacheNeededPermissions = json; this._cacheNeededPermissions = json;
return; return;
} }
@ -396,7 +396,7 @@ export class PermissionManager extends AbstractCommandHandler {
entry = new NeededPermissionValue(info, -2); entry = new NeededPermissionValue(info, -2);
this.neededPermissions.push(entry); this.neededPermissions.push(entry);
} else { } else {
log.warn(LogCategory.PERMISSIONS, tr("Could not resolve perm for id %s (%o|%o)"), e["permid"], e, info); logWarn(LogCategory.PERMISSIONS, tr("Could not resolve perm for id %s (%o|%o)"), e["permid"], e, info);
continue; continue;
} }
addcount++; addcount++;
@ -417,7 +417,7 @@ export class PermissionManager extends AbstractCommandHandler {
log.table(LogType.DEBUG, LogCategory.PERMISSIONS, "Needed client permissions", table_entries); log.table(LogType.DEBUG, LogCategory.PERMISSIONS, "Needed client permissions", table_entries);
group.end(); group.end();
log.debug(LogCategory.PERMISSIONS, tr("Dropping %o needed permissions and added %o permissions."), copy.length, addcount); logDebug(LogCategory.PERMISSIONS, tr("Dropping %o needed permissions and added %o permissions."), copy.length, addcount);
for(let e of copy) { for(let e of copy) {
e.value = -2; e.value = -2;
for(const listener of this.needed_permission_change_listener[e.type.name] || []) for(const listener of this.needed_permission_change_listener[e.type.name] || [])
@ -704,10 +704,10 @@ export class PermissionManager extends AbstractCommandHandler {
if(perm.type.id == key || perm.type.name == key || perm.type == key) if(perm.type.id == key || perm.type.name == key || perm.type == key)
return perm; return perm;
log.debug(LogCategory.PERMISSIONS, tr("Could not resolve grant permission %o. Creating a new one."), key); logDebug(LogCategory.PERMISSIONS, tr("Could not resolve grant permission %o. Creating a new one."), key);
let info = key instanceof PermissionInfo ? key : this.resolveInfo(key); let info = key instanceof PermissionInfo ? key : this.resolveInfo(key);
if(!info) { if(!info) {
log.warn(LogCategory.PERMISSIONS, tr("Requested needed permission with invalid key! (%o)"), key); logWarn(LogCategory.PERMISSIONS, tr("Requested needed permission with invalid key! (%o)"), key);
return new NeededPermissionValue(undefined, -2); return new NeededPermissionValue(undefined, -2);
} }
let result = new NeededPermissionValue(info, -2); let result = new NeededPermissionValue(info, -2);

View file

@ -135,7 +135,7 @@ async function loadConnectProfiles() {
try { try {
return profiles_json ? JSON.parse(profiles_json) : {version: 0} as any; return profiles_json ? JSON.parse(profiles_json) : {version: 0} as any;
} catch (error) { } catch (error) {
console.error(tr("Invalid profile json! Resetting profiles :( (%o)"), profiles_json); logError(LogCategory.IDENTITIES, tr("Invalid profile json! Resetting profiles :( (%o)"), profiles_json);
createErrorModal(tr("Profile data invalid"), formatMessage(tr("The profile data is invalid.{:br:}This might cause data loss."))).open(); createErrorModal(tr("Profile data invalid"), formatMessage(tr("The profile data is invalid.{:br:}This might cause data loss."))).open();
return { version: 0 }; return { version: 0 };
} }
@ -151,7 +151,7 @@ async function loadConnectProfiles() {
for (const profile_data of profiles_data.profiles) { for (const profile_data of profiles_data.profiles) {
const profile = await decodeProfile(profile_data); const profile = await decodeProfile(profile_data);
if (typeof profile === "string") { if (typeof profile === "string") {
console.error(tr("Failed to load profile. Reason: %s, Profile data: %s"), profile, profiles_data); logError(LogCategory.IDENTITIES, tr("Failed to load profile. Reason: %s, Profile data: %s"), profile, profiles_data);
} else { } else {
availableProfiles_.push(profile as ConnectionProfile); availableProfiles_.push(profile as ConnectionProfile);
} }

View file

@ -1,6 +1,7 @@
import {AbstractServerConnection, ServerCommand} from "../connection/ConnectionBase"; import {AbstractServerConnection, ServerCommand} from "../connection/ConnectionBase";
import {HandshakeIdentityHandler} from "../connection/HandshakeHandler"; import {HandshakeIdentityHandler} from "../connection/HandshakeHandler";
import {AbstractCommandHandler} from "../connection/AbstractCommandHandler"; import {AbstractCommandHandler} from "../connection/AbstractCommandHandler";
import {LogCategory, logError, logWarn} from "tc-shared/log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
export enum IdentitifyType { export enum IdentitifyType {
@ -45,8 +46,7 @@ export async function decode_identity(type: IdentitifyType, data: string) : Prom
try { try {
await identity.decode(data) await identity.decode(data)
} catch(error) { } catch(error) {
/* todo better error handling! */ logError(LogCategory.IDENTITIES, tr("Failed to decode identity: %o"), error);
console.error(error);
return undefined; return undefined;
} }
@ -87,7 +87,7 @@ export class HandshakeCommandHandler<T extends AbstractHandshakeIdentityHandler>
} else if(command.command == "error") { } else if(command.command == "error") {
return false; return false;
} else { } else {
console.warn(tr("Received unknown command while handshaking (%o)"), command); logWarn(LogCategory.IDENTITIES, tr("Received unknown command while handshaking (%o)"), command);
} }
return true; return true;
} }

View file

@ -4,8 +4,7 @@ import {
IdentitifyType, IdentitifyType,
Identity Identity
} from "../../profiles/Identity"; } from "../../profiles/Identity";
import * as log from "../../log"; import {LogCategory, logError} from "../../log";
import {LogCategory} from "../../log";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import {AbstractServerConnection} from "../../connection/ConnectionBase"; import {AbstractServerConnection} from "../../connection/ConnectionBase";
import {HandshakeIdentityHandler} from "../../connection/HandshakeHandler"; import {HandshakeIdentityHandler} from "../../connection/HandshakeHandler";
@ -30,7 +29,7 @@ class NameHandshakeHandler extends AbstractHandshakeIdentityHandler {
authentication_method: this.identity.type(), authentication_method: this.identity.type(),
client_nickname: this.identity.name() client_nickname: this.identity.name()
}).catch(error => { }).catch(error => {
log.error(LogCategory.IDENTITIES, tr("Failed to initialize name based handshake. Error: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to initialize name based handshake. Error: %o"), error);
if(error instanceof CommandResult) if(error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;
this.trigger_fail("failed to execute begin (" + error + ")"); this.trigger_fail("failed to execute begin (" + error + ")");

View file

@ -4,8 +4,7 @@ import {
IdentitifyType, IdentitifyType,
Identity Identity
} from "../../profiles/Identity"; } from "../../profiles/Identity";
import * as log from "../../log"; import {LogCategory, logError} from "../../log";
import {LogCategory} from "../../log";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import {AbstractServerConnection} from "../../connection/ConnectionBase"; import {AbstractServerConnection} from "../../connection/ConnectionBase";
import {HandshakeIdentityHandler} from "../../connection/HandshakeHandler"; import {HandshakeIdentityHandler} from "../../connection/HandshakeHandler";
@ -30,7 +29,7 @@ class TeaForumHandshakeHandler extends AbstractHandshakeIdentityHandler {
authentication_method: this.identity.type(), authentication_method: this.identity.type(),
data: this.identity.data().data_json() data: this.identity.data().data_json()
}).catch(error => { }).catch(error => {
log.error(LogCategory.IDENTITIES, tr("Failed to initialize TeaForum based handshake. Error: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to initialize TeaForum based handshake. Error: %o"), error);
if(error instanceof CommandResult) if(error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;
@ -43,7 +42,7 @@ class TeaForumHandshakeHandler extends AbstractHandshakeIdentityHandler {
this.connection.send_command("handshakeindentityproof", { this.connection.send_command("handshakeindentityproof", {
proof: this.identity.data().data_sign() proof: this.identity.data().data_sign()
}).catch(error => { }).catch(error => {
log.error(LogCategory.IDENTITIES, tr("Failed to proof the identity. Error: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to proof the identity. Error: %o"), error);
if(error instanceof CommandResult) if(error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;

View file

@ -1,5 +1,4 @@
import * as log from "../../log"; import {LogCategory, logError, logInfo, logTrace, logWarn} from "../../log";
import {LogCategory, logTrace, logWarn} from "../../log";
import * as asn1 from "../../crypto/asn1"; import * as asn1 from "../../crypto/asn1";
import * as sha from "../../crypto/sha"; import * as sha from "../../crypto/sha";
@ -244,7 +243,7 @@ export class TeaSpeakHandshakeHandler extends AbstractHandshakeIdentityHandler {
authentication_method: this.identity.type(), authentication_method: this.identity.type(),
publicKey: this.identity.publicKey publicKey: this.identity.publicKey
}).catch(error => { }).catch(error => {
log.error(LogCategory.IDENTITIES, tr("Failed to initialize TeamSpeak based handshake. Error: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to initialize TeamSpeak based handshake. Error: %o"), error);
if(error instanceof CommandResult) if(error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;
@ -260,7 +259,7 @@ export class TeaSpeakHandshakeHandler extends AbstractHandshakeIdentityHandler {
this.identity.sign_message(json[0]["message"], json[0]["digest"]).then(proof => { this.identity.sign_message(json[0]["message"], json[0]["digest"]).then(proof => {
this.connection.send_command("handshakeindentityproof", {proof: proof}).catch(error => { this.connection.send_command("handshakeindentityproof", {proof: proof}).catch(error => {
log.error(LogCategory.IDENTITIES, tr("Failed to proof the identity. Error: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to proof the identity. Error: %o"), error);
if(error instanceof CommandResult) if(error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;
@ -318,7 +317,7 @@ class IdentityPOWWorker {
resolve(); resolve();
}; };
this._worker.onerror = event => { this._worker.onerror = event => {
log.error(LogCategory.IDENTITIES, tr("POW Worker error %o"), event); logError(LogCategory.IDENTITIES, tr("POW Worker error %o"), event);
clearTimeout(timeout_id); clearTimeout(timeout_id);
reject("Failed to load worker (" + event.message + ")"); reject("Failed to load worker (" + event.message + ")");
}; };
@ -433,7 +432,7 @@ class IdentityPOWWorker {
}; };
}); });
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, tr("Failed to finalize POW worker! (%o)"), error); logError(LogCategory.IDENTITIES, tr("Failed to finalize POW worker! (%o)"), error);
} }
} }
@ -442,7 +441,7 @@ class IdentityPOWWorker {
} }
private handle_message(message: any) { private handle_message(message: any) {
log.info(LogCategory.IDENTITIES, tr("Received message: %o"), message); logInfo(LogCategory.IDENTITIES, tr("Received message: %o"), message);
} }
} }
@ -452,7 +451,7 @@ export class TeaSpeakIdentity implements Identity {
try { try {
key = await crypto.subtle.generateKey({name:'ECDH', namedCurve: 'P-256'}, true, ["deriveKey"]); key = await crypto.subtle.generateKey({name:'ECDH', namedCurve: 'P-256'}, true, ["deriveKey"]);
} catch(e) { } catch(e) {
log.error(LogCategory.IDENTITIES, tr("Could not generate a new key: %o"), e); logError(LogCategory.IDENTITIES, tr("Could not generate a new key: %o"), e);
throw "Failed to generate keypair"; throw "Failed to generate keypair";
} }
const private_key = await CryptoHelper.export_ecc_key(key.privateKey, false); const private_key = await CryptoHelper.export_ecc_key(key.privateKey, false);
@ -509,7 +508,7 @@ export class TeaSpeakIdentity implements Identity {
try { try {
buffer = new Uint8Array(arrayBufferBase64(data)); buffer = new Uint8Array(arrayBufferBase64(data));
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, tr("Failed to decode given base64 data (%s)"), data); logError(LogCategory.IDENTITIES, tr("Failed to decode given base64 data (%s)"), data);
throw "failed to base data (base64 decode failed)"; throw "failed to base data (base64 decode failed)";
} }
const key64 = await CryptoHelper.decryptTeaSpeakIdentity(buffer); const key64 = await CryptoHelper.decryptTeaSpeakIdentity(buffer);
@ -538,7 +537,7 @@ export class TeaSpeakIdentity implements Identity {
if(this.private_key && (typeof(initialize) === "undefined" || initialize)) { if(this.private_key && (typeof(initialize) === "undefined" || initialize)) {
this.initialize().catch(error => { this.initialize().catch(error => {
log.error(LogCategory.IDENTITIES, "Failed to initialize TeaSpeakIdentity (%s)", error); logError(LogCategory.IDENTITIES, "Failed to initialize TeaSpeakIdentity (%s)", error);
this._initialized = false; this._initialized = false;
}); });
} }
@ -698,7 +697,7 @@ export class TeaSpeakIdentity implements Identity {
try { try {
await Promise.all(initialize_promise); await Promise.all(initialize_promise);
} catch (error) { } catch (error) {
log.error(LogCategory.IDENTITIES, error); logError(LogCategory.IDENTITIES, error);
throw "failed to initialize"; throw "failed to initialize";
} }
} }
@ -753,7 +752,7 @@ export class TeaSpeakIdentity implements Identity {
if (worker.current_level() > best_level) { if (worker.current_level() > best_level) {
this.hash_number = worker.current_hash(); this.hash_number = worker.current_hash();
log.info(LogCategory.IDENTITIES, "Found new best at %s (%d). Old was %d", this.hash_number, worker.current_level(), best_level); logInfo(LogCategory.IDENTITIES, "Found new best at %s (%d). Old was %d", this.hash_number, worker.current_level(), best_level);
best_level = worker.current_level(); best_level = worker.current_level();
if (callback_level) if (callback_level)
callback_level(best_level); callback_level(best_level);
@ -777,7 +776,7 @@ export class TeaSpeakIdentity implements Identity {
}).catch(error => { }).catch(error => {
worker_promise.remove(p); worker_promise.remove(p);
log.warn(LogCategory.IDENTITIES, "POW worker error %o", error); logWarn(LogCategory.IDENTITIES, "POW worker error %o", error);
reject(error); reject(error);
return Promise.resolve(); return Promise.resolve();
@ -803,7 +802,7 @@ export class TeaSpeakIdentity implements Identity {
try { try {
await Promise.all(finalize_promise); await Promise.all(finalize_promise);
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, "Failed to shutdown worker: %o", error); logError(LogCategory.IDENTITIES, "Failed to shutdown worker: %o", error);
} }
} }
throw "this should never be reached"; throw "this should never be reached";
@ -882,14 +881,14 @@ export class TeaSpeakIdentity implements Identity {
try { try {
this._crypto_key_sign = await crypto.subtle.importKey("jwk", jwk, {name:'ECDSA', namedCurve: 'P-256'}, false, ["sign"]); this._crypto_key_sign = await crypto.subtle.importKey("jwk", jwk, {name:'ECDSA', namedCurve: 'P-256'}, false, ["sign"]);
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, error); logError(LogCategory.IDENTITIES, error);
throw "failed to create crypto sign key"; throw "failed to create crypto sign key";
} }
try { try {
this._crypto_key = await crypto.subtle.importKey("jwk", jwk, {name:'ECDH', namedCurve: 'P-256'}, true, ["deriveKey"]); this._crypto_key = await crypto.subtle.importKey("jwk", jwk, {name:'ECDH', namedCurve: 'P-256'}, true, ["deriveKey"]);
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, error); logError(LogCategory.IDENTITIES, error);
throw "failed to create crypto key"; throw "failed to create crypto key";
} }
@ -897,7 +896,7 @@ export class TeaSpeakIdentity implements Identity {
this.publicKey = await CryptoHelper.export_ecc_key(this._crypto_key, true); this.publicKey = await CryptoHelper.export_ecc_key(this._crypto_key, true);
this._unique_id = base64_encode_ab(await sha.sha1(this.publicKey)); this._unique_id = base64_encode_ab(await sha.sha1(this.publicKey));
} catch(error) { } catch(error) {
log.error(LogCategory.IDENTITIES, error); logError(LogCategory.IDENTITIES, error);
throw "failed to calculate unique id"; throw "failed to calculate unique id";
} }

View file

@ -1,8 +1,7 @@
import {settings, Settings} from "../../settings"; import {settings, Settings} from "../../settings";
import * as loader from "tc-loader"; import * as loader from "tc-loader";
import * as fidentity from "./TeaForumIdentity"; import * as fidentity from "./TeaForumIdentity";
import * as log from "../../log"; import {LogCategory, logDebug, logError, logInfo, logWarn} from "../../log";
import {LogCategory} from "../../log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
declare global { declare global {
@ -48,7 +47,7 @@ export namespace gcaptcha {
script.remove(); script.remove();
script = undefined; script = undefined;
console.error(tr("Failed to fetch recaptcha javascript source: %o"), error); logError(LogCategory.GENERAL, tr("Failed to fetch recaptcha javascript source: %o"), error);
throw tr("failed to download source"); throw tr("failed to download source");
} finally { } finally {
if(script) if(script)
@ -66,7 +65,7 @@ export namespace gcaptcha {
try { try {
await initialize(); await initialize();
} catch(error) { } catch(error) {
console.error(tr("Failed to initialize G-Recaptcha. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to initialize G-Recaptcha. Error: %o"), error);
throw tr("initialisation failed"); throw tr("initialisation failed");
} }
if(container.attr("captcha-uuid")) if(container.attr("captcha-uuid"))
@ -163,7 +162,7 @@ export async function login(username: string, password: string, captcha?: any) :
success: resolve, success: resolve,
error: (xhr, status, error) => { error: (xhr, status, error) => {
console.log(tr("Login request failed %o: %o"), status, error); logDebug(LogCategory.GENERAL, tr("Login request failed %o: %o"), status, error);
reject(tr("request failed")); reject(tr("request failed"));
} }
}) })
@ -176,7 +175,7 @@ export async function login(username: string, password: string, captcha?: any) :
} }
if(response["status"] !== "ok") { if(response["status"] !== "ok") {
console.error(tr("Response status not okey. Error happend: %o"), response); logError(LogCategory.GENERAL, tr("Response status not okey. Error happend: %o"), response);
return { return {
status: "error", status: "error",
error_message: (response["errors"] || [])[0] || tr("Unknown error") error_message: (response["errors"] || [])[0] || tr("Unknown error")
@ -184,7 +183,7 @@ export async function login(username: string, password: string, captcha?: any) :
} }
if(!response["success"]) { if(!response["success"]) {
console.error(tr("Login failed. Response %o"), response); logError(LogCategory.GENERAL, tr("Login failed. Response %o"), response);
let message = tr("failed to login"); let message = tr("failed to login");
let captcha; let captcha;
@ -216,7 +215,7 @@ export async function login(username: string, password: string, captcha?: any) :
localStorage.setItem("teaspeak-forum-auth", response["auth-key"]); localStorage.setItem("teaspeak-forum-auth", response["auth-key"]);
fidentity.update_forum(); fidentity.update_forum();
} catch(error) { } catch(error) {
console.error(tr("Failed to parse forum given data: %o"), error); logError(LogCategory.GENERAL, tr("Failed to parse forum given data: %o"), error);
return { return {
status: "error", status: "error",
error_message: tr("Failed to parse response data") error_message: tr("Failed to parse response data")
@ -245,7 +244,7 @@ export async function renew_data() : Promise<"success" | "login-required"> {
success: resolve, success: resolve,
error: (xhr, status, error) => { error: (xhr, status, error) => {
console.log(tr("Renew request failed %o: %o"), status, error); logError(LogCategory.GENERAL, tr("Renew request failed %o: %o"), status, error);
reject(tr("request failed")); reject(tr("request failed"));
} }
}) })
@ -255,7 +254,7 @@ export async function renew_data() : Promise<"success" | "login-required"> {
} }
if(response["status"] !== "ok") { if(response["status"] !== "ok") {
console.error(tr("Response status not okey. Error happend: %o"), response); logError(LogCategory.GENERAL, tr("Response status not okey. Error happend: %o"), response);
throw (response["errors"] || [])[0] || tr("Unknown error"); throw (response["errors"] || [])[0] || tr("Unknown error");
} }
@ -268,7 +267,7 @@ export async function renew_data() : Promise<"success" | "login-required"> {
if(!response["data"] || !response["sign"]) if(!response["data"] || !response["sign"])
throw tr("response missing data"); throw tr("response missing data");
console.debug(tr("Renew succeeded. Parsing data.")); logDebug(LogCategory.GENERAL, tr("Renew succeeded. Parsing data."));
try { try {
_data = new Data(_data.auth_key, response["data"], response["sign"]); _data = new Data(_data.auth_key, response["data"], response["sign"]);
@ -276,7 +275,7 @@ export async function renew_data() : Promise<"success" | "login-required"> {
localStorage.setItem("teaspeak-forum-sign", response["sign"]); localStorage.setItem("teaspeak-forum-sign", response["sign"]);
fidentity.update_forum(); fidentity.update_forum();
} catch(error) { } catch(error) {
console.error(tr("Failed to parse forum given data: %o"), error); logError(LogCategory.GENERAL, tr("Failed to parse forum given data: %o"), error);
throw tr("failed to parse data"); throw tr("failed to parse data");
} }
@ -303,7 +302,7 @@ export async function logout() : Promise<void> {
success: resolve, success: resolve,
error: (xhr, status, error) => { error: (xhr, status, error) => {
console.log(tr("Logout request failed %o: %o"), status, error); logInfo(LogCategory.GENERAL, tr("Logout request failed %o: %o"), status, error);
reject(tr("request failed")); reject(tr("request failed"));
} }
}) })
@ -313,7 +312,7 @@ export async function logout() : Promise<void> {
} }
if(response["status"] !== "ok") { if(response["status"] !== "ok") {
console.error(tr("Response status not okey. Error happend: %o"), response); logError(LogCategory.GENERAL, tr("Response status not okey. Error happend: %o"), response);
throw (response["errors"] || [])[0] || tr("Unknown error"); throw (response["errors"] || [])[0] || tr("Unknown error");
} }
@ -339,53 +338,53 @@ loader.register_task(loader.Stage.JAVASCRIPT_INITIALIZING, {
const raw_sign = localStorage.getItem("teaspeak-forum-sign"); const raw_sign = localStorage.getItem("teaspeak-forum-sign");
const forum_auth = localStorage.getItem("teaspeak-forum-auth"); const forum_auth = localStorage.getItem("teaspeak-forum-auth");
if(!raw_data || !raw_sign || !forum_auth) { if(!raw_data || !raw_sign || !forum_auth) {
console.log(tr("No TeaForo authentification found. TeaForo connection status: unconnected")); logInfo(LogCategory.GENERAL, tr("No TeaForo authentification found. TeaForo connection status: unconnected"));
return; return;
} }
try { try {
_data = new Data(forum_auth, raw_data, raw_sign); _data = new Data(forum_auth, raw_data, raw_sign);
} catch(error) { } catch(error) {
console.error(tr("Failed to initialize TeaForo connection from local data. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to initialize TeaForo connection from local data. Error: %o"), error);
return; return;
} }
if(_data.should_renew()) { if(_data.should_renew()) {
console.info(tr("TeaForo data should be renewed. Executing renew.")); logInfo(LogCategory.GENERAL, tr("TeaForo data should be renewed. Executing renew."));
renew_data().then(status => { renew_data().then(status => {
if(status === "success") { if(status === "success") {
console.info(tr("TeaForo data has been successfully renewed.")); logInfo(LogCategory.GENERAL, tr("TeaForo data has been successfully renewed."));
} else { } else {
console.warn(tr("Failed to renew TeaForo data. New login required.")); logWarn(LogCategory.GENERAL, tr("Failed to renew TeaForo data. New login required."));
localStorage.removeItem("teaspeak-forum-data"); localStorage.removeItem("teaspeak-forum-data");
localStorage.removeItem("teaspeak-forum-sign"); localStorage.removeItem("teaspeak-forum-sign");
localStorage.removeItem("teaspeak-forum-auth"); localStorage.removeItem("teaspeak-forum-auth");
} }
}).catch(error => { }).catch(error => {
console.warn(tr("Failed to renew TeaForo data. An error occurred: %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to renew TeaForo data. An error occurred: %o"), error);
}); });
return; return;
} }
if(_data && _data.is_expired()) { if(_data && _data.is_expired()) {
console.error(tr("TeaForo data is expired. TeaForo connection isn't available!")); logError(LogCategory.GENERAL, tr("TeaForo data is expired. TeaForo connection isn't available!"));
} }
setInterval(() => { setInterval(() => {
/* if we don't have any _data object set we could not renew anything */ /* if we don't have any _data object set we could not renew anything */
if(_data) { if(_data) {
log.info(LogCategory.IDENTITIES, tr("Renewing TeaForo data.")); logInfo(LogCategory.IDENTITIES, tr("Renewing TeaForo data."));
renew_data().then(status => { renew_data().then(status => {
if(status === "success") { if(status === "success") {
log.info(LogCategory.IDENTITIES,tr("TeaForo data has been successfully renewed.")); logInfo(LogCategory.IDENTITIES,tr("TeaForo data has been successfully renewed."));
} else { } else {
log.warn(LogCategory.IDENTITIES,tr("Failed to renew TeaForo data. New login required.")); logWarn(LogCategory.IDENTITIES,tr("Failed to renew TeaForo data. New login required."));
localStorage.removeItem("teaspeak-forum-data"); localStorage.removeItem("teaspeak-forum-data");
localStorage.removeItem("teaspeak-forum-sign"); localStorage.removeItem("teaspeak-forum-sign");
localStorage.removeItem("teaspeak-forum-auth"); localStorage.removeItem("teaspeak-forum-auth");
} }
}).catch(error => { }).catch(error => {
console.warn(tr("Failed to renew TeaForo data. An error occurred: %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to renew TeaForo data. An error occurred: %o"), error);
}); });
} }
}, 24 * 60 * 60 * 1000); }, 24 * 60 * 60 * 1000);

View file

@ -1,6 +1,7 @@
/* setup jsrenderer */ /* setup jsrenderer */
import "jsrender"; import "jsrender";
import {tr} from "./i18n/localize"; import {tr} from "./i18n/localize";
import {LogCategory, logTrace} from "tc-shared/log";
if(__build.target === "web") { if(__build.target === "web") {
(window as any).$ = require("jquery"); (window as any).$ = require("jquery");
@ -114,11 +115,11 @@ if(!JSON.map_to) {
let updates = 0; let updates = 0;
for (let field of variables) { for (let field of variables) {
if (typeof json[field] === "undefined") { if (typeof json[field] === "undefined") {
console.trace(tr("Json does not contains %s"), field); logTrace(LogCategory.GENERAL, tr("Json does not contains %s"), field);
continue; continue;
} }
if (!validator(field, json[field])) { if (!validator(field, json[field])) {
console.trace(tr("Validator results in false for %s"), field); logTrace(LogCategory.GENERAL, tr("Validator results in false for %s"), field);
continue; continue;
} }

View file

@ -1,5 +1,5 @@
import * as log from "./log"; import * as log from "./log";
import {LogCategory, logTrace} from "./log"; import {LogCategory, logError, logTrace} from "./log";
import * as loader from "tc-loader"; import * as loader from "tc-loader";
import {Stage} from "tc-loader"; import {Stage} from "tc-loader";
import {Registry} from "./events"; import {Registry} from "./events";
@ -82,11 +82,11 @@ function resolveKey<ValueType extends RegistryValueType, DefaultType>(
let value = resolver(key.key); let value = resolver(key.key);
if(typeof value === "string") { if(typeof value === "string") {
return this.decodeValueFromString(value, key.valueType); return decodeValueFromString(value, key.valueType);
} }
/* trying fallback values */ /* trying fallback values */
for(const fallback of key.fallbackKeys) { for(const fallback of key.fallbackKeys || []) {
value = resolver(fallback); value = resolver(fallback);
if(typeof value !== "string") { if(typeof value !== "string") {
continue; continue;
@ -125,7 +125,7 @@ export namespace AppParameters {
search.substr(1).split("&").forEach(part => { search.substr(1).split("&").forEach(part => {
let item = part.split("="); let item = part.split("=");
this.staticValues[item[0]] = decodeURIComponent(item[1]); parameters[item[0]] = decodeURIComponent(item[1]);
}); });
} }
@ -793,7 +793,7 @@ export class Settings {
try { try {
this.cacheGlobal = JSON.parse(json); this.cacheGlobal = JSON.parse(json);
} catch(error) { } catch(error) {
log.error(LogCategory.GENERAL, tr("Failed to load global settings!\nJson: %s\nError: %o"), json, error); logError(LogCategory.GENERAL, tr("Failed to load global settings!\nJson: %s\nError: %o"), json, error);
const show_popup = () => { const show_popup = () => {
//FIXME: Readd this //FIXME: Readd this
@ -823,6 +823,7 @@ export class Settings {
} else if("defaultValue" in key) { } else if("defaultValue" in key) {
return resolveKey(key, key => this.cacheGlobal[key], key.defaultValue); return resolveKey(key, key => this.cacheGlobal[key], key.defaultValue);
} else { } else {
debugger;
throw tr("missing default value"); throw tr("missing default value");
} }
} }
@ -900,7 +901,9 @@ export class ServerSettings {
this.serverSaveWorker = undefined; this.serverSaveWorker = undefined;
} }
getValue<V extends RegistryValueType, DV extends V | undefined = undefined>(key: RegistryKey<V> | ValuedRegistryKey<V>, defaultValue?: DV) : V | DV { getValue<V extends RegistryValueType, DV>(key: RegistryKey<V>, defaultValue: DV) : V | DV;
getValue<V extends RegistryValueType>(key: ValuedRegistryKey<V>, defaultValue?: V) : V;
getValue(key, defaultValue) {
if(this._destroyed) { if(this._destroyed) {
throw "destroyed"; throw "destroyed";
} }
@ -910,6 +913,7 @@ export class ServerSettings {
} else if("defaultValue" in key) { } else if("defaultValue" in key) {
return resolveKey(key, key => this.cacheServer[key], key.defaultValue); return resolveKey(key, key => this.cacheServer[key], key.defaultValue);
} else { } else {
debugger;
throw tr("missing default value"); throw tr("missing default value");
} }
} }
@ -950,7 +954,7 @@ export class ServerSettings {
try { try {
this.cacheServer = JSON.parse(json); this.cacheServer = JSON.parse(json);
} catch(error) { } catch(error) {
log.error(LogCategory.GENERAL, tr("Failed to load server settings for server %s!\nJson: %s\nError: %o"), server_unique_id, json, error); logError(LogCategory.GENERAL, tr("Failed to load server settings for server %s!\nJson: %s\nError: %o"), server_unique_id, json, error);
} }
if(!this.cacheServer) if(!this.cacheServer)
this.cacheServer = {}; this.cacheServer = {};

View file

@ -1,5 +1,5 @@
import * as log from "../log"; import * as log from "../log";
import {LogCategory} from "../log"; import {LogCategory, logError, logInfo, logWarn} from "../log";
import {Settings, settings} from "../settings"; import {Settings, settings} from "../settings";
import {ConnectionHandler} from "../ConnectionHandler"; import {ConnectionHandler} from "../ConnectionHandler";
import * as sbackend from "tc-backend/audio/sounds"; import * as sbackend from "tc-backend/audio/sounds";
@ -199,7 +199,7 @@ export function initialize() : Promise<void> {
resolve(); resolve();
}, },
error: error => { error: error => {
log.error(LogCategory.AUDIO, "error: %o", error); logError(LogCategory.AUDIO, "error: %o", error);
reject(); reject();
}, },
timeout: 5000, timeout: 5000,
@ -239,7 +239,7 @@ export class SoundManager {
options = options || {}; options = options || {};
const volume = get_sound_volume(_sound, options.default_volume); const volume = get_sound_volume(_sound, options.default_volume);
log.info(LogCategory.AUDIO, tr("Replaying sound %s (Sound volume: %o | Master volume %o)"), _sound, volume, master_volume); logInfo(LogCategory.AUDIO, tr("Replaying sound %s (Sound volume: %o | Master volume %o)"), _sound, volume, master_volume);
if(volume == 0 || master_volume == 0) if(volume == 0 || master_volume == 0)
return; return;
@ -251,7 +251,7 @@ export class SoundManager {
if(!handle) return; if(!handle) return;
if(!options.ignore_overlap && (this._playing_sounds[handle.filename] > 0) && !overlap_activated()) { if(!options.ignore_overlap && (this._playing_sounds[handle.filename] > 0) && !overlap_activated()) {
log.info(LogCategory.AUDIO, tr("Dropping requested playback for sound %s because it would overlap."), _sound); logInfo(LogCategory.AUDIO, tr("Dropping requested playback for sound %s because it would overlap."), _sound);
return; return;
} }
@ -263,14 +263,14 @@ export class SoundManager {
if(options.callback) if(options.callback)
options.callback(true); options.callback(true);
}).catch(error => { }).catch(error => {
log.warn(LogCategory.AUDIO, tr("Failed to replay sound %s: %o"), handle.filename, error); logWarn(LogCategory.AUDIO, tr("Failed to replay sound %s: %o"), handle.filename, error);
if(options.callback) if(options.callback)
options.callback(false); options.callback(false);
}).then(() => { }).then(() => {
this._playing_sounds[handle.filename]--; this._playing_sounds[handle.filename]--;
}); });
}).catch(error => { }).catch(error => {
log.warn(LogCategory.AUDIO, tr("Failed to replay sound %o because it could not be resolved: %o"), _sound, error); logWarn(LogCategory.AUDIO, tr("Failed to replay sound %o because it could not be resolved: %o"), _sound, error);
if(options.callback) if(options.callback)
options.callback(false); options.callback(false);
}); });

View file

@ -1,4 +1,4 @@
import {LogCategory} from "./log"; import {LogCategory, logDebug, logInfo, logTrace, logWarn} from "./log";
import * as log from "./log"; import * as log from "./log";
import { tr } from "./i18n/localize"; import { tr } from "./i18n/localize";
@ -74,7 +74,7 @@ function initialize_config_object(target_object: any, source_object: any) : any
export function initialize(config: Config) { export function initialize(config: Config) {
current_config = initialize_config_object(config || {}, DEFAULT_CONFIG); current_config = initialize_config_object(config || {}, DEFAULT_CONFIG);
if(current_config.verbose) if(current_config.verbose)
log.info(LogCategory.STATISTICS, tr("Initializing statistics with this config: %o"), current_config); logInfo(LogCategory.STATISTICS, tr("Initializing statistics with this config: %o"), current_config);
connection.start_connection(); connection.start_connection();
} }
@ -108,7 +108,7 @@ namespace connection {
if(connection_copy !== connection) return; if(connection_copy !== connection) return;
if(current_config.verbose) if(current_config.verbose)
log.warn(LogCategory.STATISTICS, tr("Lost connection to statistics server (Connection closed). Reason: %o. Event object: %o"), CloseCodes[event.code] || event.code, event); logWarn(LogCategory.STATISTICS, tr("Lost connection to statistics server (Connection closed). Reason: %o. Event object: %o"), CloseCodes[event.code] || event.code, event);
if(event.code != CloseCodes.BANNED) if(event.code != CloseCodes.BANNED)
invoke_reconnect(); invoke_reconnect();
@ -118,7 +118,7 @@ namespace connection {
if(connection_copy !== connection) return; if(connection_copy !== connection) return;
if(current_config.verbose) if(current_config.verbose)
log.debug(LogCategory.STATISTICS, tr("Successfully connected to server. Initializing session.")); logDebug(LogCategory.STATISTICS, tr("Successfully connected to server. Initializing session."));
connection_state = ConnectionState.INITIALIZING; connection_state = ConnectionState.INITIALIZING;
initialize_session(); initialize_session();
@ -128,7 +128,7 @@ namespace connection {
if(connection_copy !== connection) return; if(connection_copy !== connection) return;
if(current_config.verbose) if(current_config.verbose)
log.warn(LogCategory.STATISTICS, tr("Received an error. Closing connection. Object: %o"), event); logWarn(LogCategory.STATISTICS, tr("Received an error. Closing connection. Object: %o"), event);
connection.close(CloseCodes.INTERNAL_ERROR); connection.close(CloseCodes.INTERNAL_ERROR);
invoke_reconnect(); invoke_reconnect();
@ -139,7 +139,7 @@ namespace connection {
if(typeof(event.data) !== 'string') { if(typeof(event.data) !== 'string') {
if(current_config.verbose) if(current_config.verbose)
log.warn(LogCategory.STATISTICS, tr("Received an message which isn't a string. Event object: %o"), event); logWarn(LogCategory.STATISTICS, tr("Received an message which isn't a string. Event object: %o"), event);
return; return;
} }
@ -168,11 +168,11 @@ namespace connection {
} }
if(current_config.verbose) if(current_config.verbose)
log.info(LogCategory.STATISTICS, tr("Scheduled reconnect in %dms"), current_config.reconnect_interval); logInfo(LogCategory.STATISTICS, tr("Scheduled reconnect in %dms"), current_config.reconnect_interval);
reconnect_timer = setTimeout(() => { reconnect_timer = setTimeout(() => {
if(current_config.verbose) if(current_config.verbose)
log.info(LogCategory.STATISTICS, tr("Reconnecting")); logInfo(LogCategory.STATISTICS, tr("Reconnecting"));
start_connection(); start_connection();
}, current_config.reconnect_interval); }, current_config.reconnect_interval);
} }
@ -210,10 +210,10 @@ namespace connection {
if(typeof(handler[type]) === 'function') { if(typeof(handler[type]) === 'function') {
if(current_config.verbose) if(current_config.verbose)
log.trace(LogCategory.STATISTICS, tr("Handling message of type %s"), type); logTrace(LogCategory.STATISTICS, tr("Handling message of type %s"), type);
handler[type](data); handler[type](data);
} else if(current_config.verbose) { } else if(current_config.verbose) {
log.warn(LogCategory.STATISTICS, tr("Received message with an unknown type (%s). Dropping message. Full message: %o"), type, data_object); logWarn(LogCategory.STATISTICS, tr("Received message with an unknown type (%s). Dropping message. Full message: %o"), type, data_object);
} }
} }
@ -229,7 +229,7 @@ namespace connection {
interface NotifyInitialized {} interface NotifyInitialized {}
function handle_notify_initialized(json: NotifyInitialized) { function handle_notify_initialized(json: NotifyInitialized) {
if(current_config.verbose) if(current_config.verbose)
log.info(LogCategory.STATISTICS, tr("Session successfully initialized.")); logInfo(LogCategory.STATISTICS, tr("Session successfully initialized."));
connection_state = ConnectionState.CONNECTED; connection_state = ConnectionState.CONNECTED;
} }

View file

@ -12,10 +12,11 @@ import {MenuEntryType, spawn_context_menu} from "tc-shared/ui/elements/ContextMe
import '!style-loader!css-loader!highlight.js/styles/darcula.css'; import '!style-loader!css-loader!highlight.js/styles/darcula.css';
import {Settings, settings} from "tc-shared/settings"; import {Settings, settings} from "tc-shared/settings";
import {LogCategory, logWarn} from "tc-shared/log";
const registerLanguage = (name, language: Promise<any>) => { const registerLanguage = (name, language: Promise<any>) => {
language.then(lan => hljs.registerLanguage(name, lan)).catch(error => { language.then(lan => hljs.registerLanguage(name, lan)).catch(error => {
console.warn("Failed to load language %s (%o)", name, error); logWarn(LogCategory.CHAT, tr("Failed to load language %s (%o)"), name, error);
}); });
}; };

View file

@ -108,7 +108,6 @@ export function preprocessChatMessageForSend(message: string) : string {
break; break;
} }
} }
console.error("Message: %s; No Parse: %s", message, noParseRanges);
message = bbcodeLinkUrls(message, noParseRanges); message = bbcodeLinkUrls(message, noParseRanges);
} }

View file

@ -1,5 +1,5 @@
import * as log from "../log"; import * as log from "../log";
import {LogCategory, logTrace} from "../log"; import {LogCategory, logDebug, logTrace, logWarn} from "../log";
import { import {
CodeToken, CodeToken,
Env, Env,
@ -135,10 +135,10 @@ export class MD2BBCodeRenderer {
} }
private renderToken(token: Token) { private renderToken(token: Token) {
log.debug(LogCategory.GENERAL, tr("Render Markdown token: %o"), token); logDebug(LogCategory.GENERAL, tr("Render Markdown token: %o"), token);
const renderer = MD2BBCodeRenderer.renderers[token.type]; const renderer = MD2BBCodeRenderer.renderers[token.type];
if(typeof(renderer) === "undefined") { if(typeof(renderer) === "undefined") {
log.warn(LogCategory.CHAT, tr("Missing markdown to bbcode renderer for token %s: %o"), token.type, token); logWarn(LogCategory.CHAT, tr("Missing markdown to bbcode renderer for token %s: %o"), token.type, token);
return 'content' in token ? this.options().textProcessor(token.content) : ""; return 'content' in token ? this.options().textProcessor(token.content) : "";
} }

View file

@ -1,7 +1,7 @@
import {ChannelTree} from "./ChannelTree"; import {ChannelTree} from "./ChannelTree";
import {ClientEntry, ClientEvents} from "./Client"; import {ClientEntry, ClientEvents} from "./Client";
import * as log from "../log"; import * as log from "../log";
import {LogCategory, LogType} from "../log"; import {LogCategory, logInfo, LogType, logWarn} from "../log";
import {PermissionType} from "../permission/PermissionType"; import {PermissionType} from "../permission/PermissionType";
import {settings, Settings} from "../settings"; import {settings, Settings} from "../settings";
import * as contextmenu from "../ui/elements/ContextMenu"; import * as contextmenu from "../ui/elements/ContextMenu";
@ -223,7 +223,7 @@ export class ChannelEntry extends ChannelTreeEntry<ChannelEvents> {
}); });
this.collapsed = this.channelTree.client.settings.getValue(Settings.FN_SERVER_CHANNEL_COLLAPSED(this.channelId)); this.collapsed = this.channelTree.client.settings.getValue(Settings.FN_SERVER_CHANNEL_COLLAPSED(this.channelId));
this.subscriptionMode = this.channelTree.client.settings.getValue(Settings.FN_SERVER_CHANNEL_SUBSCRIBE_MODE(this.channelId)); this.subscriptionMode = this.channelTree.client.settings.getValue(Settings.FN_SERVER_CHANNEL_SUBSCRIBE_MODE(this.channelId), ChannelSubscribeMode.INHERITED);
this.channelDescriptionCached = false; this.channelDescriptionCached = false;
this.channelDescriptionCallback = []; this.channelDescriptionCallback = [];
@ -310,7 +310,7 @@ export class ChannelEntry extends ChannelTreeEntry<ChannelEvents> {
unregisterClient(client: ClientEntry, noEvent?: boolean) { unregisterClient(client: ClientEntry, noEvent?: boolean) {
client.events.off("notify_properties_updated", this.clientPropertyChangedListener); client.events.off("notify_properties_updated", this.clientPropertyChangedListener);
if(!this.client_list.remove(client)) { if(!this.client_list.remove(client)) {
log.warn(LogCategory.CHANNEL, tr("Unregistered unknown client from channel %s"), this.channelName()); logWarn(LogCategory.CHANNEL, tr("Unregistered unknown client from channel %s"), this.channelName());
} }
} }
@ -508,7 +508,7 @@ export class ChannelEntry extends ChannelTreeEntry<ChannelEvents> {
this.channelTree.client.serverConnection.send_command("channeledit", properties).then(() => { this.channelTree.client.serverConnection.send_command("channeledit", properties).then(() => {
this.channelTree.client.sound.play(Sound.CHANNEL_EDITED_SELF); this.channelTree.client.sound.play(Sound.CHANNEL_EDITED_SELF);
}); });
log.info(LogCategory.CHANNEL, tr("Changed channel properties of channel %s: %o"), this.channelName(), properties); logInfo(LogCategory.CHANNEL, tr("Changed channel properties of channel %s: %o"), this.channelName(), properties);
} }
if(permissions.length > 0) { if(permissions.length > 0) {
@ -720,7 +720,6 @@ export class ChannelEntry extends ChannelTreeEntry<ChannelEvents> {
cached_password() { return this.cachedPasswordHash; } cached_password() { return this.cachedPasswordHash; }
async updateSubscribeMode() { async updateSubscribeMode() {
console.error("Update subscribe mode");
let shouldBeSubscribed = false; let shouldBeSubscribed = false;
switch (this.subscriptionMode) { switch (this.subscriptionMode) {
case ChannelSubscribeMode.INHERITED: case ChannelSubscribeMode.INHERITED:

View file

@ -1,7 +1,6 @@
import * as contextmenu from "tc-shared/ui/elements/ContextMenu"; import * as contextmenu from "tc-shared/ui/elements/ContextMenu";
import {MenuEntryType} from "tc-shared/ui/elements/ContextMenu"; import {MenuEntryType} from "tc-shared/ui/elements/ContextMenu";
import * as log from "tc-shared/log"; import {LogCategory, logDebug, logError, logWarn} from "tc-shared/log";
import {LogCategory, logError, logWarn} from "tc-shared/log";
import {PermissionType} from "tc-shared/permission/PermissionType"; import {PermissionType} from "tc-shared/permission/PermissionType";
import {Sound} from "tc-shared/sound/Sounds"; import {Sound} from "tc-shared/sound/Sounds";
import {Group} from "tc-shared/permission/GroupManager"; import {Group} from "tc-shared/permission/GroupManager";
@ -236,12 +235,12 @@ export class ChannelTree {
batch_updates(BatchUpdateType.CHANNEL_TREE); batch_updates(BatchUpdateType.CHANNEL_TREE);
try { try {
if(!this.channels.remove(channel)) { if(!this.channels.remove(channel)) {
log.warn(LogCategory.CHANNEL, tr("Deleting an unknown channel!")); logWarn(LogCategory.CHANNEL, tr("Deleting an unknown channel!"));
} }
channel.children(false).forEach(e => this.deleteChannel(e)); channel.children(false).forEach(e => this.deleteChannel(e));
if(channel.clients(false).length !== 0) { if(channel.clients(false).length !== 0) {
log.warn(LogCategory.CHANNEL, tr("Deleting a non empty channel! This could cause some errors.")); logWarn(LogCategory.CHANNEL, tr("Deleting a non empty channel! This could cause some errors."));
for(const client of channel.clients(false)) { for(const client of channel.clients(false)) {
this.deleteClient(client, { reason: ViewReasonId.VREASON_SYSTEM, serverLeave: false }); this.deleteClient(client, { reason: ViewReasonId.VREASON_SYSTEM, serverLeave: false });
} }
@ -308,7 +307,7 @@ export class ChannelTree {
moveChannel(channel: ChannelEntry, channelPrevious: ChannelEntry, parent: ChannelEntry, isInsertMove: boolean) { moveChannel(channel: ChannelEntry, channelPrevious: ChannelEntry, parent: ChannelEntry, isInsertMove: boolean) {
if(channelPrevious != null && channelPrevious.parent != parent) { if(channelPrevious != null && channelPrevious.parent != parent) {
console.error(tr("Invalid channel move (different parents! (%o|%o)"), channelPrevious.parent, parent); logError(LogCategory.CHANNEL, tr("Invalid channel move (different parents! (%o|%o)"), channelPrevious.parent, parent);
return; return;
} }
@ -890,11 +889,11 @@ export class ChannelTree {
spawnCreateChannel(parent?: ChannelEntry) { spawnCreateChannel(parent?: ChannelEntry) {
spawnChannelEditNew(this.client, undefined, parent, (properties, permissions) => { spawnChannelEditNew(this.client, undefined, parent, (properties, permissions) => {
properties["cpid"] = parent ? parent.channelId : 0; properties["cpid"] = parent ? parent.channelId : 0;
log.debug(LogCategory.CHANNEL, tr("Creating a new channel.\nProperties: %o\nPermissions: %o"), properties); logDebug(LogCategory.CHANNEL, tr("Creating a new channel.\nProperties: %o\nPermissions: %o"), properties);
this.client.serverConnection.send_command("channelcreate", properties).then(() => { this.client.serverConnection.send_command("channelcreate", properties).then(() => {
let channel = this.find_channel_by_name(properties.channel_name, parent, true); let channel = this.find_channel_by_name(properties.channel_name, parent, true);
if(!channel) { if(!channel) {
log.error(LogCategory.CHANNEL, tr("Failed to resolve channel after creation. Could not apply permissions!")); logError(LogCategory.CHANNEL, tr("Failed to resolve channel after creation. Could not apply permissions!"));
return; return;
} }
@ -947,11 +946,11 @@ export class ChannelTree {
if(channels.length > 0) { if(channels.length > 0) {
this.client.serverConnection.send_command('channelsubscribe', channels.map(e => { return {cid: e}; })).catch(error => { this.client.serverConnection.send_command('channelsubscribe', channels.map(e => { return {cid: e}; })).catch(error => {
console.warn(tr("Failed to subscribe to specific channels (%o): %o"), channels, error); logWarn(LogCategory.NETWORKING, tr("Failed to subscribe to specific channels (%o): %o"), channels, error);
}); });
} }
}).catch(error => { }).catch(error => {
console.warn(tr("Failed to unsubscribe to all channels! (%o)"), error); logWarn(LogCategory.NETWORKING, tr("Failed to unsubscribe to all channels! (%o)"), error);
}); });
} }
@ -969,11 +968,11 @@ export class ChannelTree {
if(channels.length > 0) { if(channels.length > 0) {
this.client.serverConnection.send_command('channelunsubscribe', channels.map(e => { return {cid: e}; })).catch(error => { this.client.serverConnection.send_command('channelunsubscribe', channels.map(e => { return {cid: e}; })).catch(error => {
console.warn(tr("Failed to unsubscribe to specific channels (%o): %o"), channels, error); logWarn(LogCategory.CHANNEL, tr("Failed to unsubscribe to specific channels (%o): %o"), channels, error);
}); });
} }
}).catch(error => { }).catch(error => {
console.warn(tr("Failed to subscribe to all channels! (%o)"), error); logWarn(LogCategory.CHANNEL, tr("Failed to subscribe to all channels! (%o)"), error);
}); });
} }

View file

@ -2,7 +2,7 @@ import * as contextmenu from "../ui/elements/ContextMenu";
import {Registry} from "../events"; import {Registry} from "../events";
import {ChannelTree} from "./ChannelTree"; import {ChannelTree} from "./ChannelTree";
import * as log from "../log"; import * as log from "../log";
import {LogCategory, logInfo, LogType} from "../log"; import {LogCategory, logDebug, logError, logInfo, LogType} from "../log";
import {Settings, settings} from "../settings"; import {Settings, settings} from "../settings";
import {Sound} from "../sound/Sounds"; import {Sound} from "../sound/Sounds";
import {Group, GroupManager, GroupTarget, GroupType} from "../permission/GroupManager"; import {Group, GroupManager, GroupTarget, GroupType} from "../permission/GroupManager";
@ -219,11 +219,11 @@ export class ClientEntry<Events extends ClientEvents = ClientEvents> extends Cha
destroy() { destroy() {
if(this.voiceHandle) { if(this.voiceHandle) {
log.error(LogCategory.AUDIO, tr("Destroying client with an active audio handle. This could cause memory leaks!")); logError(LogCategory.AUDIO, tr("Destroying client with an active audio handle. This could cause memory leaks!"));
this.setVoiceClient(undefined); this.setVoiceClient(undefined);
} }
if(this.videoHandle) { if(this.videoHandle) {
log.error(LogCategory.AUDIO, tr("Destroying client with an active video handle. This could cause memory leaks!")); logError(LogCategory.AUDIO, tr("Destroying client with an active video handle. This could cause memory leaks!"));
this.setVideoClient(undefined); this.setVideoClient(undefined);
} }
@ -767,7 +767,7 @@ export class ClientEntry<Events extends ClientEvents = ClientEvents> extends Cha
const mute_status = this.channelTree.client.settings.getValue(Settings.FN_CLIENT_MUTED(this.clientUid()), false); const mute_status = this.channelTree.client.settings.getValue(Settings.FN_CLIENT_MUTED(this.clientUid()), false);
this.setMuted(mute_status, mute_status); /* force only needed when we want to mute the client */ this.setMuted(mute_status, mute_status); /* force only needed when we want to mute the client */
this.updateVoiceVolume(); this.updateVoiceVolume();
log.debug(LogCategory.CLIENT, tr("Loaded client (%s) server specific properties. Volume: %o Muted: %o."), this.clientUid(), this.voiceVolume, this.voiceMuted); logDebug(LogCategory.CLIENT, tr("Loaded client (%s) server specific properties. Volume: %o Muted: %o."), this.clientUid(), this.voiceVolume, this.voiceMuted);
} }
if(variable.key == "client_talk_power") { if(variable.key == "client_talk_power") {
reorder_channel = true; reorder_channel = true;

View file

@ -2,7 +2,7 @@ import {ChannelTree} from "./ChannelTree";
import {Settings, settings} from "../settings"; import {Settings, settings} from "../settings";
import * as contextmenu from "../ui/elements/ContextMenu"; import * as contextmenu from "../ui/elements/ContextMenu";
import * as log from "../log"; import * as log from "../log";
import {LogCategory, LogType} from "../log"; import {LogCategory, logInfo, LogType} from "../log";
import {Sound} from "../sound/Sounds"; import {Sound} from "../sound/Sounds";
import * as bookmarks from "../bookmarks"; import * as bookmarks from "../bookmarks";
import {spawnInviteEditor} from "../ui/modal/ModalInvite"; import {spawnInviteEditor} from "../ui/modal/ModalInvite";
@ -228,8 +228,7 @@ export class ServerEntry extends ChannelTreeEntry<ServerEvents> {
name: tr("Edit"), name: tr("Edit"),
callback: () => { callback: () => {
createServerModal(this, properties => { createServerModal(this, properties => {
log.info(LogCategory.SERVER, tr("Changing server properties %o"), properties); logInfo(LogCategory.SERVER, tr("Changing server properties %o"), properties);
console.log(tr("Changed properties: %o"), properties);
if (Object.keys(properties || {}).length > 0) { if (Object.keys(properties || {}).length > 0) {
return this.channelTree.client.serverConnection.send_command("serveredit", properties).then(() => { return this.channelTree.client.serverConnection.send_command("serveredit", properties).then(() => {
this.channelTree.client.sound.play(Sound.SERVER_EDITED_SELF); this.channelTree.client.sound.play(Sound.SERVER_EDITED_SELF);

View file

@ -1,4 +1,5 @@
import * as React from "react"; import * as React from "react";
import {useEffect, useState} from "react";
import {ControlBar2} from "tc-shared/ui/frames/control-bar/Renderer"; import {ControlBar2} from "tc-shared/ui/frames/control-bar/Renderer";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {ControlBarEvents} from "tc-shared/ui/frames/control-bar/Definitions"; import {ControlBarEvents} from "tc-shared/ui/frames/control-bar/Definitions";
@ -15,7 +16,6 @@ import {FooterRenderer} from "tc-shared/ui/frames/footer/Renderer";
import {HostBanner} from "tc-shared/ui/frames/HostBannerRenderer"; import {HostBanner} from "tc-shared/ui/frames/HostBannerRenderer";
import {HostBannerUiEvents} from "tc-shared/ui/frames/HostBannerDefinitions"; import {HostBannerUiEvents} from "tc-shared/ui/frames/HostBannerDefinitions";
import {AppUiEvents} from "tc-shared/ui/AppDefinitions"; import {AppUiEvents} from "tc-shared/ui/AppDefinitions";
import {useEffect, useState} from "react";
import {ChannelTreeRenderer} from "tc-shared/ui/tree/Renderer"; import {ChannelTreeRenderer} from "tc-shared/ui/tree/Renderer";
import {ChannelTreeUIEvents} from "tc-shared/ui/tree/Definitions"; import {ChannelTreeUIEvents} from "tc-shared/ui/tree/Definitions";

View file

@ -1,6 +1,5 @@
import {Settings, settings} from "../../settings"; import {Settings, settings} from "../../settings";
import {LogCategory} from "../../log"; import {LogCategory, logDebug, logError} from "../../log";
import * as log from "../../log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
declare global { declare global {
@ -132,12 +131,12 @@ if(!$.fn.dividerfy) {
try { try {
const config = JSON.parse(settings.getValue(Settings.FN_SEPARATOR_STATE(seperator_id), undefined)); const config = JSON.parse(settings.getValue(Settings.FN_SEPARATOR_STATE(seperator_id), undefined));
if(config) { if(config) {
log.debug(LogCategory.GENERAL, tr("Applying previous changed sperator settings for %s: %o"), seperator_id, config); logDebug(LogCategory.GENERAL, tr("Applying previous changed sperator settings for %s: %o"), seperator_id, config);
apply_view(config.property, config.previous, config.next); apply_view(config.property, config.previous, config.next);
} }
} catch(e) { } catch(e) {
if(!(e instanceof SyntaxError)) if(!(e instanceof SyntaxError))
log.error(LogCategory.GENERAL, tr("Failed to parse seperator settings for sperator %s: %o"), seperator_id, e); logError(LogCategory.GENERAL, tr("Failed to parse seperator settings for sperator %s: %o"), seperator_id, e);
} }
} }
}); });

View file

@ -1,5 +1,6 @@
import {closeContextMenu, ContextMenuEntry, spawnContextMenu} from "tc-shared/ui/ContextMenu"; import {closeContextMenu, ContextMenuEntry, spawnContextMenu} from "tc-shared/ui/ContextMenu";
import {ClientIcon} from "svg-sprites/client-icons"; import {ClientIcon} from "svg-sprites/client-icons";
import {LogCategory, logError} from "tc-shared/log";
export interface MenuEntry { export interface MenuEntry {
callback?: () => void; callback?: () => void;
@ -57,7 +58,7 @@ export interface ContextMenuProvider {
let provider: ContextMenuProvider; let provider: ContextMenuProvider;
export function spawn_context_menu(x: number, y: number, ...entries: MenuEntry[]) { export function spawn_context_menu(x: number, y: number, ...entries: MenuEntry[]) {
if(!provider) { if(!provider) {
console.error(tr("Failed to spawn context menu! Missing provider!")); logError(LogCategory.GENERAL, tr("Failed to spawn context menu! Missing provider!"));
return; return;
} }

View file

@ -2,6 +2,7 @@ import * as loader from "tc-loader";
import {Stage} from "tc-loader"; import {Stage} from "tc-loader";
import {KeyCode} from "../../PPTListener"; import {KeyCode} from "../../PPTListener";
import * as $ from "jquery"; import * as $ from "jquery";
import {LogCategory, logError} from "tc-shared/log";
export enum ElementType { export enum ElementType {
HEADER, HEADER,
@ -40,7 +41,7 @@ export const ModalFunctions = {
case "undefined": case "undefined":
return undefined; return undefined;
default: default:
console.error(("Invalid type %o"), typeof val); logError(LogCategory.GENERAL, "Invalid type %o", typeof val);
return $(); return $();
} }
}, },
@ -210,7 +211,6 @@ export class Modal {
const body = ModalFunctions.jqueriefy(this.properties.body, ElementType.BODY); const body = ModalFunctions.jqueriefy(this.properties.body, ElementType.BODY);
const footer = ModalFunctions.jqueriefy(this.properties.footer, ElementType.FOOTER); const footer = ModalFunctions.jqueriefy(this.properties.footer, ElementType.FOOTER);
//FIXME: cache template
const template = $(this.properties.template || "#tmpl_modal"); const template = $(this.properties.template || "#tmpl_modal");
const properties = { const properties = {

View file

@ -1,3 +1,5 @@
import {LogCategory, logDebug} from "tc-shared/log";
export type Entry = { export type Entry = {
timestamp: number; timestamp: number;
@ -120,10 +122,11 @@ export class Graph {
if(Graph._loops.length == 1) { if(Graph._loops.length == 1) {
const static_loop = () => { const static_loop = () => {
Graph._loops.forEach(l => l()); Graph._loops.forEach(l => l());
if(Graph._loops.length > 0) if(Graph._loops.length > 0) {
requestAnimationFrame(static_loop); requestAnimationFrame(static_loop);
else } else {
console.log("STATIC terminate!"); logDebug(LogCategory.GENERAL, tr("NetGraph static terminate"));
}
}; };
static_loop(); static_loop();
} }

View file

@ -66,7 +66,6 @@ export function sliderfy(slider: JQuery, options?: SliderOptions) : Slider {
tool.hide(); tool.hide();
slider.removeClass("active"); slider.removeClass("active");
console.log("Events removed");
}; };
const mouse_listener = (event: MouseEvent | TouchEvent) => { const mouse_listener = (event: MouseEvent | TouchEvent) => {

View file

@ -1,3 +1,5 @@
import {LogCategory, logWarn} from "tc-shared/log";
declare global { declare global {
interface JQuery<TElement = HTMLElement> { interface JQuery<TElement = HTMLElement> {
asTabWidget(copy?: boolean) : JQuery<TElement>; asTabWidget(copy?: boolean) : JQuery<TElement>;
@ -19,17 +21,14 @@ if(typeof (customElements) !== "undefined") {
customElements.define('x-tag', X_Tag, { extends: 'div' }); customElements.define('x-tag', X_Tag, { extends: 'div' });
customElements.define('x-content', X_Content, { extends: 'div' }); customElements.define('x-content', X_Content, { extends: 'div' });
} catch(error) { } catch(error) {
console.warn("failed to define costum elements"); logWarn(LogCategory.GENERAL, tr("failed to define costume elements"));
} }
} else { } else {
console.warn(tr("Could not defied tab customElements!")); logWarn(LogCategory.GENERAL, tr("Could not defied tab customElements!"));
} }
export const TabFunctions = { export const TabFunctions = {
tabify(template: JQuery, copy: boolean = true) : JQuery { tabify(template: JQuery, copy: boolean = true) : JQuery {
console.log("Tabify: copy=" + copy);
console.log(template);
let tag = $.spawn("div"); let tag = $.spawn("div");
tag.addClass("tab"); tag.addClass("tab");
@ -48,7 +47,6 @@ export const TabFunctions = {
const update_height = () => { const update_height = () => {
const height_watcher = tag.find("> .tab-content .height-watcher"); const height_watcher = tag.find("> .tab-content .height-watcher");
const entries: JQuery = tag.find("> .tab-content-invisible x-content, > .tab-content x-content"); const entries: JQuery = tag.find("> .tab-content-invisible x-content, > .tab-content x-content");
console.error(entries);
let max_height = 0; let max_height = 0;
entries.each((_, _e) => { entries.each((_, _e) => {
@ -92,8 +90,6 @@ export const TabFunctions = {
} else { } else {
element.first().trigger('click'); element.first().trigger('click');
} }
console.log("Next: %o", tag_header.next('.entry:visible'));
console.log("prev: %o", tag_header.prev('.entry:visible'));
} }
}); });
} }
@ -111,7 +107,6 @@ export const TabFunctions = {
let entries = tag_content.find(".tab-show-partitional"); let entries = tag_content.find(".tab-show-partitional");
entries.hide(); entries.hide();
const show_next = index => { const show_next = index => {
console.log("Show " + index);
if(index >= entries.length) return; if(index >= entries.length) return;
entries.eq(index).show(); entries.eq(index).show();
@ -123,7 +118,6 @@ export const TabFunctions = {
tag_content.show(); tag_content.show();
}); });
console.log(this);
header.append(tag_header); header.append(tag_header);
}); });

View file

@ -4,7 +4,7 @@ import * as React from "react";
import {useEffect, useRef, useState} from "react"; import {useEffect, useRef, useState} from "react";
import {useGlobalSetting, useTr} from "tc-shared/ui/react-elements/Helper"; import {useGlobalSetting, useTr} from "tc-shared/ui/react-elements/Helper";
import {ErrorBoundary} from "tc-shared/ui/react-elements/ErrorBoundary"; import {ErrorBoundary} from "tc-shared/ui/react-elements/ErrorBoundary";
import {Settings, settings} from "tc-shared/settings"; import {Settings} from "tc-shared/settings";
const cssStyle = require("./HostBannerRenderer.scss"); const cssStyle = require("./HostBannerRenderer.scss");

View file

@ -7,10 +7,10 @@ import {ClientInfoRenderer} from "tc-shared/ui/frames/side/ClientInfoRenderer";
import {PrivateConversationsPanel} from "tc-shared/ui/frames/side/PrivateConversationRenderer"; import {PrivateConversationsPanel} from "tc-shared/ui/frames/side/PrivateConversationRenderer";
import {ChannelBarRenderer} from "tc-shared/ui/frames/side/ChannelBarRenderer"; import {ChannelBarRenderer} from "tc-shared/ui/frames/side/ChannelBarRenderer";
import {LogCategory, logWarn} from "tc-shared/log"; import {LogCategory, logWarn} from "tc-shared/log";
import React = require("react");
import {ErrorBoundary} from "tc-shared/ui/react-elements/ErrorBoundary"; import {ErrorBoundary} from "tc-shared/ui/react-elements/ErrorBoundary";
import {MusicBotRenderer} from "tc-shared/ui/frames/side/MusicBotRenderer"; import {MusicBotRenderer} from "tc-shared/ui/frames/side/MusicBotRenderer";
import {ConversationPanel} from "tc-shared/ui/frames/side/AbstractConversationRenderer"; import {ConversationPanel} from "tc-shared/ui/frames/side/AbstractConversationRenderer";
import React = require("react");
const cssStyle = require("./SideBarRenderer.scss"); const cssStyle = require("./SideBarRenderer.scss");

View file

@ -1,6 +1,5 @@
import {LogCategory} from "../../log"; import {LogCategory, logWarn} from "../../log";
import {settings, Settings} from "../../settings"; import {settings, Settings} from "../../settings";
import * as log from "../../log";
import * as loader from "tc-loader"; import * as loader from "tc-loader";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
@ -83,7 +82,7 @@ export function formatMessage(pattern: string, ...objects: any[]) : JQuery[] {
} }
if(objects.length < number) if(objects.length < number)
log.warn(LogCategory.GENERAL, tr("Message to format contains invalid index (%o)"), number); logWarn(LogCategory.GENERAL, tr("Message to format contains invalid index (%o)"), number);
result.push(...formatElement(objects[number])); result.push(...formatElement(objects[number]));
} }
@ -136,7 +135,7 @@ export function parseMessageWithArguments(pattern: string, argumentCount: number
} }
if(argumentCount < number) { if(argumentCount < number) {
log.warn(LogCategory.GENERAL, tr("Message to format contains invalid index (%o)"), number); logWarn(LogCategory.GENERAL, tr("Message to format contains invalid index (%o)"), number);
result.push("{" + offset.toString() + "}"); result.push("{" + offset.toString() + "}");
} else { } else {
result.push(number); result.push(number);

View file

@ -2,6 +2,7 @@ import * as React from "react";
import {ReactComponentBase} from "tc-shared/ui/react-elements/ReactComponentBase"; import {ReactComponentBase} from "tc-shared/ui/react-elements/ReactComponentBase";
import {DropdownContainer} from "./DropDown"; import {DropdownContainer} from "./DropDown";
import {ClientIcon} from "svg-sprites/client-icons"; import {ClientIcon} from "svg-sprites/client-icons";
const cssStyle = require("./Button.scss"); const cssStyle = require("./Button.scss");
export interface ButtonState { export interface ButtonState {

View file

@ -3,7 +3,8 @@ import {
Bookmark, Bookmark,
ControlBarEvents, ControlBarEvents,
ControlBarMode, ControlBarMode,
HostButtonInfo, VideoDeviceInfo, HostButtonInfo,
VideoDeviceInfo,
VideoState VideoState
} from "tc-shared/ui/frames/control-bar/Definitions"; } from "tc-shared/ui/frames/control-bar/Definitions";
import {server_connections} from "tc-shared/ConnectionManager"; import {server_connections} from "tc-shared/ConnectionManager";
@ -412,7 +413,6 @@ export function initializeControlBarController(events: Registry<ControlBarEvents
}); });
events.on("action_toggle_video", event => { events.on("action_toggle_video", event => {
if(infoHandler.getCurrentHandler()) { if(infoHandler.getCurrentHandler()) {
/* TODO: Just update the stream and don't "rebroadcast" */
global_client_actions.fire("action_toggle_video_broadcasting", { global_client_actions.fire("action_toggle_video_broadcasting", {
connection: infoHandler.getCurrentHandler(), connection: infoHandler.getCurrentHandler(),
broadcastType: event.broadcastType, broadcastType: event.broadcastType,

View file

@ -2,6 +2,7 @@ import * as React from "react";
import {ReactComponentBase} from "tc-shared/ui/react-elements/ReactComponentBase"; import {ReactComponentBase} from "tc-shared/ui/react-elements/ReactComponentBase";
import {IconRenderer, RemoteIconRenderer} from "tc-shared/ui/react-elements/Icon"; import {IconRenderer, RemoteIconRenderer} from "tc-shared/ui/react-elements/Icon";
import {getIconManager, RemoteIconInfo} from "tc-shared/file/Icons"; import {getIconManager, RemoteIconInfo} from "tc-shared/file/Icons";
const cssStyle = require("./Button.scss"); const cssStyle = require("./Button.scss");
export interface DropdownEntryProperties { export interface DropdownEntryProperties {

View file

@ -6,7 +6,8 @@ import {
ControlBarEvents, ControlBarEvents,
ControlBarMode, ControlBarMode,
HostButtonInfo, HostButtonInfo,
MicrophoneState, VideoDeviceInfo, MicrophoneState,
VideoDeviceInfo,
VideoState VideoState
} from "tc-shared/ui/frames/control-bar/Definitions"; } from "tc-shared/ui/frames/control-bar/Definitions";
import * as React from "react"; import * as React from "react";

View file

@ -1,7 +1,6 @@
import * as React from "react"; import * as React from "react";
import {useMemo} from "react";
import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {useEffect, useMemo, useState} from "react";
import {ConnectionHandler} from "tc-shared/ConnectionHandler";
import {server_connections} from "tc-shared/ConnectionManager"; import {server_connections} from "tc-shared/ConnectionManager";
import {StatusController} from "tc-shared/ui/frames/footer/StatusController"; import {StatusController} from "tc-shared/ui/frames/footer/StatusController";
import {ConnectionStatusEvents} from "tc-shared/ui/frames/footer/StatusDefinitions"; import {ConnectionStatusEvents} from "tc-shared/ui/frames/footer/StatusDefinitions";
@ -23,8 +22,8 @@ const VersionsRenderer = () => (
</React.Fragment> </React.Fragment>
); );
/* FIXME: Outsource this! */
const RtcStatus = () => { const RtcStatus = () => {
/* FIXME: Outsource this! */
const statusController = useMemo(() => new StatusController(new Registry<ConnectionStatusEvents>()), []); const statusController = useMemo(() => new StatusController(new Registry<ConnectionStatusEvents>()), []);
statusController.setConnectionHandler(server_connections.getActiveConnectionHandler()); statusController.setConnectionHandler(server_connections.getActiveConnectionHandler());

View file

@ -8,7 +8,6 @@ import * as React from "react";
import {useContext, useEffect, useRef, useState} from "react"; import {useContext, useEffect, useRef, useState} from "react";
import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {network} from "tc-shared/ui/frames/chat"; import {network} from "tc-shared/ui/frames/chat";
import {date_format} from "tc-shared/utils/DateUtils";
const cssStyle = require("./Renderer.scss"); const cssStyle = require("./Renderer.scss");
export const StatusEvents = React.createContext<Registry<ConnectionStatusEvents>>(undefined); export const StatusEvents = React.createContext<Registry<ConnectionStatusEvents>>(undefined);

View file

@ -1,7 +1,7 @@
import {VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {useContext, useEffect, useRef, useState} from "react";
import * as React from "react"; import * as React from "react";
import {useContext, useEffect, useRef, useState} from "react";
import {findLogEventRenderer} from "./RendererEvent"; import {findLogEventRenderer} from "./RendererEvent";
import {LogMessage} from "tc-shared/connectionlog/Definitions"; import {LogMessage} from "tc-shared/connectionlog/Definitions";
import {ServerEventLogUiEvents} from "tc-shared/ui/frames/log/Definitions"; import {ServerEventLogUiEvents} from "tc-shared/ui/frames/log/Definitions";

View file

@ -5,7 +5,6 @@ import {formatDate} from "tc-shared/MessageFormatter";
import {BBCodeRenderer} from "tc-shared/text/bbcode"; import {BBCodeRenderer} from "tc-shared/text/bbcode";
import {format_time} from "tc-shared/ui/frames/chat"; import {format_time} from "tc-shared/ui/frames/chat";
import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration"; import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration";
import {XBBCodeRenderer} from "vendor/xbbcode/react";
import {ChannelTag, ClientTag} from "tc-shared/ui/tree/EntryTags"; import {ChannelTag, ClientTag} from "tc-shared/ui/tree/EntryTags";
import {EventChannelData, EventClient, EventType, TypeInfo} from "tc-shared/connectionlog/Definitions"; import {EventChannelData, EventClient, EventType, TypeInfo} from "tc-shared/connectionlog/Definitions";

View file

@ -1,16 +1,12 @@
import { import {AbstractConversationUiEvents, ChatHistoryState} from "./AbstractConversationDefinitions";
ChatHistoryState,
AbstractConversationUiEvents
} from "./AbstractConversationDefinitions";
import {EventHandler, Registry} from "../../../events"; import {EventHandler, Registry} from "../../../events";
import * as log from "../../../log"; import {LogCategory, logError} from "../../../log";
import {LogCategory} from "../../../log"; import {tr, tra} from "../../../i18n/localize";
import {tra, tr} from "../../../i18n/localize";
import { import {
AbstractChat, AbstractChat,
AbstractConversationEvents,
AbstractChatManager, AbstractChatManager,
AbstractChatManagerEvents AbstractChatManagerEvents,
AbstractConversationEvents
} from "tc-shared/conversations/AbstractConversion"; } from "tc-shared/conversations/AbstractConversion";
export const kMaxChatFrameMessageSize = 50; /* max 100 messages, since the server does not support more than 100 messages queried at once */ export const kMaxChatFrameMessageSize = 50; /* max 100 messages, since the server does not support more than 100 messages queried at once */
@ -288,7 +284,7 @@ export abstract class AbstractConversationController<
chatId: event.chatId chatId: event.chatId
}); });
log.error(LogCategory.CLIENT, tr("Tried to query history for an unknown conversation with id %s"), event.chatId); logError(LogCategory.CLIENT, tr("Tried to query history for an unknown conversation with id %s"), event.chatId);
return; return;
} }
@ -305,7 +301,7 @@ export abstract class AbstractConversationController<
protected handleSendMessage(event: AbstractConversationUiEvents["action_send_message"]) { protected handleSendMessage(event: AbstractConversationUiEvents["action_send_message"]) {
const conversation = this.conversationManager?.findConversationById(event.chatId); const conversation = this.conversationManager?.findConversationById(event.chatId);
if(!conversation) { if(!conversation) {
log.error(LogCategory.CLIENT, tr("Tried to send a chat message to an unknown conversation with id %s"), event.chatId); logError(LogCategory.CLIENT, tr("Tried to send a chat message to an unknown conversation with id %s"), event.chatId);
return; return;
} }
@ -316,7 +312,7 @@ export abstract class AbstractConversationController<
protected handleJumpToPresent(event: AbstractConversationUiEvents["action_jump_to_present"]) { protected handleJumpToPresent(event: AbstractConversationUiEvents["action_jump_to_present"]) {
const conversation = this.conversationManager?.findConversationById(event.chatId); const conversation = this.conversationManager?.findConversationById(event.chatId);
if(!conversation) { if(!conversation) {
log.error(LogCategory.CLIENT, tr("Tried to jump to present for an unknown conversation with id %s"), event.chatId); logError(LogCategory.CLIENT, tr("Tried to jump to present for an unknown conversation with id %s"), event.chatId);
return; return;
} }

View file

@ -1,21 +1,22 @@
import * as React from "react"; import * as React from "react";
import {EventHandler, ReactEventHandler, Registry} from "tc-shared/events";
import {Ref, useEffect, useRef, useState} from "react"; import {Ref, useEffect, useRef, useState} from "react";
import {EventHandler, ReactEventHandler, Registry} from "tc-shared/events";
import {AvatarRenderer} from "tc-shared/ui/react-elements/Avatar"; import {AvatarRenderer} from "tc-shared/ui/react-elements/Avatar";
import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable} from "tc-shared/ui/react-elements/i18n";
import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots";
import {Countdown} from "tc-shared/ui/react-elements/Countdown"; import {Countdown} from "tc-shared/ui/react-elements/Countdown";
import { import {
AbstractConversationUiEvents,
ChatEvent, ChatEvent,
ChatEventLocalAction, ChatEventLocalAction,
ChatEventLocalUserSwitch, ChatEventLocalUserSwitch,
ChatEventMessageSendFailed, ChatEventMessageSendFailed,
ChatEventModeChanged,
ChatEventPartnerAction,
ChatEventPartnerInstanceChanged, ChatEventPartnerInstanceChanged,
ChatEventQueryFailed, ChatEventQueryFailed,
ChatEventPartnerAction,
ChatHistoryState, ChatHistoryState,
ChatMessage, ChatMessage
AbstractConversationUiEvents, ChatEventModeChanged
} from "./AbstractConversationDefinitions"; } from "./AbstractConversationDefinitions";
import {TimestampRenderer} from "tc-shared/ui/react-elements/TimestampRenderer"; import {TimestampRenderer} from "tc-shared/ui/react-elements/TimestampRenderer";
import {BBCodeRenderer} from "tc-shared/text/bbcode"; import {BBCodeRenderer} from "tc-shared/text/bbcode";

View file

@ -1,7 +1,7 @@
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {ChannelBarMode, ChannelBarModeData, ChannelBarUiEvents} from "tc-shared/ui/frames/side/ChannelBarDefinitions"; import {ChannelBarMode, ChannelBarModeData, ChannelBarUiEvents} from "tc-shared/ui/frames/side/ChannelBarDefinitions";
import {useContext, useState} from "react";
import * as React from "react"; import * as React from "react";
import {useContext, useState} from "react";
import {ConversationPanel} from "tc-shared/ui/frames/side/AbstractConversationRenderer"; import {ConversationPanel} from "tc-shared/ui/frames/side/AbstractConversationRenderer";
import {useDependentState} from "tc-shared/ui/react-elements/Helper"; import {useDependentState} from "tc-shared/ui/react-elements/Helper";
import {ChannelDescriptionRenderer} from "tc-shared/ui/frames/side/ChannelDescriptionRenderer"; import {ChannelDescriptionRenderer} from "tc-shared/ui/frames/side/ChannelDescriptionRenderer";

View file

@ -1,7 +1,6 @@
import {ConnectionHandler, ConnectionState} from "../../../ConnectionHandler"; import {ConnectionHandler} from "../../../ConnectionHandler";
import {EventHandler} from "../../../events"; import {EventHandler} from "../../../events";
import * as log from "../../../log"; import {LogCategory, logError} from "../../../log";
import {LogCategory} from "../../../log";
import {tr} from "../../../i18n/localize"; import {tr} from "../../../i18n/localize";
import {AbstractConversationUiEvents} from "./AbstractConversationDefinitions"; import {AbstractConversationUiEvents} from "./AbstractConversationDefinitions";
import {AbstractConversationController} from "./AbstractConversationController"; import {AbstractConversationController} from "./AbstractConversationController";
@ -80,7 +79,7 @@ export class ChannelConversationController extends AbstractConversationControlle
private handleMessageDelete(event: AbstractConversationUiEvents["action_delete_message"]) { private handleMessageDelete(event: AbstractConversationUiEvents["action_delete_message"]) {
const conversation = this.conversationManager?.findConversationById(event.chatId); const conversation = this.conversationManager?.findConversationById(event.chatId);
if(!conversation) { if(!conversation) {
log.error(LogCategory.CLIENT, tr("Tried to delete a chat message from an unknown conversation with id %s"), event.chatId); logError(LogCategory.CLIENT, tr("Tried to delete a chat message from an unknown conversation with id %s"), event.chatId);
return; return;
} }

View file

@ -7,8 +7,7 @@ import * as React from "react";
import {useState} from "react"; import {useState} from "react";
import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots";
import {allowedBBCodes, BBCodeRenderer} from "tc-shared/text/bbcode"; import {BBCodeRenderer} from "tc-shared/text/bbcode";
import {parse as parseBBCode} from "vendor/xbbcode/parser";
const cssStyle = require("./ChannelDescriptionRenderer.scss"); const cssStyle = require("./ChannelDescriptionRenderer.scss");

View file

@ -1,13 +1,14 @@
import * as React from "react";
import {useState} from "react"; import {useState} from "react";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {ChannelFileBrowserUiEvents} from "tc-shared/ui/frames/side/ChannelFileBrowserDefinitions"; import {ChannelFileBrowserUiEvents} from "tc-shared/ui/frames/side/ChannelFileBrowserDefinitions";
import {channelPathPrefix, FileBrowserEvents} from "tc-shared/ui/modal/transfer/FileDefinitions"; import {channelPathPrefix, FileBrowserEvents} from "tc-shared/ui/modal/transfer/FileDefinitions";
import { import {
FileBrowserClassContext, FileBrowserClassContext,
FileBrowserRenderer, FileBrowserRendererClasses, FileBrowserRenderer,
FileBrowserRendererClasses,
NavigationBar NavigationBar
} from "tc-shared/ui/modal/transfer/FileBrowserRenderer"; } from "tc-shared/ui/modal/transfer/FileBrowserRenderer";
import * as React from "react";
const cssStyle = require("./ChannelFileBrowserRenderer.scss"); const cssStyle = require("./ChannelFileBrowserRenderer.scss");

View file

@ -1,8 +1,5 @@
import {ConnectionHandler} from "tc-shared/ConnectionHandler"; import {ConnectionHandler} from "tc-shared/ConnectionHandler";
import { import {ClientGroupInfo, ClientInfoEvents,} from "tc-shared/ui/frames/side/ClientInfoDefinitions";
ClientGroupInfo,
ClientInfoEvents,
} from "tc-shared/ui/frames/side/ClientInfoDefinitions";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {openClientInfo} from "tc-shared/ui/modal/ModalClientInfo"; import {openClientInfo} from "tc-shared/ui/modal/ModalClientInfo";

View file

@ -1,7 +1,9 @@
import * as React from "react"; import * as React from "react";
import {useContext, useEffect, useState} from "react"; import {useContext, useEffect, useState} from "react";
import { import {
ClientCountryInfo, ClientForumInfo, ClientGroupInfo, ClientCountryInfo,
ClientForumInfo,
ClientGroupInfo,
ClientInfoEvents, ClientInfoEvents,
ClientInfoOnline, ClientInfoOnline,
ClientStatusInfo, ClientStatusInfo,

View file

@ -5,8 +5,6 @@ import {ChannelEntry, ChannelProperties} from "tc-shared/tree/Channel";
import {LocalClientEntry, MusicClientEntry} from "tc-shared/tree/Client"; import {LocalClientEntry, MusicClientEntry} from "tc-shared/tree/Client";
import {openMusicManage} from "tc-shared/ui/modal/ModalMusicManage"; import {openMusicManage} from "tc-shared/ui/modal/ModalMusicManage";
import {createErrorModal, createInputModal} from "tc-shared/ui/elements/Modal"; import {createErrorModal, createInputModal} from "tc-shared/ui/elements/Modal";
import {server_connections} from "tc-shared/ConnectionManager";
import {appViewController} from "tc-shared/ui/AppController";
import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration"; import {CommandResult} from "tc-shared/connection/ServerConnectionDeclaration";
import {LogCategory, logError} from "tc-shared/log"; import {LogCategory, logError} from "tc-shared/log";

View file

@ -1,13 +1,15 @@
import * as React from "react"; import * as React from "react";
import {useContext, useState} from "react";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import { import {
SideHeaderEvents, PrivateConversationInfo,
SideHeaderState,
SideHeaderChannelState, SideHeaderChannelState,
SideHeaderPingInfo, PrivateConversationInfo, SideHeaderServerInfo SideHeaderEvents,
SideHeaderPingInfo,
SideHeaderServerInfo,
SideHeaderState
} from "tc-shared/ui/frames/side/HeaderDefinitions"; } from "tc-shared/ui/frames/side/HeaderDefinitions";
import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {useContext, useState} from "react";
import {RemoteIconRenderer} from "tc-shared/ui/react-elements/Icon"; import {RemoteIconRenderer} from "tc-shared/ui/react-elements/Icon";
import {getIconManager} from "tc-shared/file/Icons"; import {getIconManager} from "tc-shared/file/Icons";

View file

@ -276,7 +276,6 @@ export class MusicBotController {
let playlistId: number = 0; let playlistId: number = 0;
if(this.currentConnection && this.currentBot) { if(this.currentConnection && this.currentBot) {
playlistId = this.currentBot.properties.client_playlist_id; playlistId = this.currentBot.properties.client_playlist_id;
console.error("Client playlist id: %o", playlistId);
} }
let playlist: SubscribedPlaylist; let playlist: SubscribedPlaylist;

View file

@ -2,13 +2,13 @@ import {Registry} from "tc-shared/events";
import {MusicPlaylistUiEvents} from "tc-shared/ui/frames/side/MusicPlaylistDefinitions"; import {MusicPlaylistUiEvents} from "tc-shared/ui/frames/side/MusicPlaylistDefinitions";
import {DefaultThumbnail, formatPlaytime, MusicPlaylistList} from "tc-shared/ui/frames/side/MusicPlaylistRenderer"; import {DefaultThumbnail, formatPlaytime, MusicPlaylistList} from "tc-shared/ui/frames/side/MusicPlaylistRenderer";
import * as React from "react"; import * as React from "react";
import {useContext, useEffect, useRef, useState} from "react";
import { import {
MusicBotPlayerState, MusicBotPlayerState,
MusicBotPlayerTimestamp, MusicBotPlayerTimestamp,
MusicBotSongInfo, MusicBotSongInfo,
MusicBotUiEvents MusicBotUiEvents
} from "tc-shared/ui/frames/side/MusicBotDefinitions"; } from "tc-shared/ui/frames/side/MusicBotDefinitions";
import {useContext, useEffect, useRef, useState} from "react";
import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable} from "tc-shared/ui/react-elements/i18n";
import {preview_image} from "tc-shared/ui/frames/image_preview"; import {preview_image} from "tc-shared/ui/frames/image_preview";
import {Slider} from "tc-shared/ui/react-elements/Slider"; import {Slider} from "tc-shared/ui/react-elements/Slider";

View file

@ -1,11 +1,11 @@
import * as React from "react"; import * as React from "react";
import {useContext, useRef, useState} from "react";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import { import {
MusicPlaylistEntryInfo, MusicPlaylistEntryInfo,
MusicPlaylistStatus, MusicPlaylistStatus,
MusicPlaylistUiEvents MusicPlaylistUiEvents
} from "tc-shared/ui/frames/side/MusicPlaylistDefinitions"; } from "tc-shared/ui/frames/side/MusicPlaylistDefinitions";
import {useContext, useRef, useState} from "react";
import {Button} from "tc-shared/ui/react-elements/Button"; import {Button} from "tc-shared/ui/react-elements/Button";
import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable} from "tc-shared/ui/react-elements/i18n";
import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots";
@ -236,7 +236,6 @@ const PlaylistEntry = React.memo((props: { serverUniqueId: string, playlistId: n
onDragEnd={() => setInsertMarker("none")} onDragEnd={() => setInsertMarker("none")}
onDrop={event => { onDrop={event => {
const info = parseDragIds(event.dataTransfer); const info = parseDragIds(event.dataTransfer);
console.error("Info: %o - %o - %o", info, insertMarker, { playlistId: props.playlistId, serverUniqueId: props.serverUniqueId });
if(!info) { if(!info) {
setInsertMarker("none"); setInsertMarker("none");
return; return;

View file

@ -4,11 +4,8 @@ import {
PrivateConversationInfo, PrivateConversationInfo,
PrivateConversationUIEvents PrivateConversationUIEvents
} from "../../../ui/frames/side/PrivateConversationDefinitions"; } from "../../../ui/frames/side/PrivateConversationDefinitions";
import { import {AbstractConversationUiEvents} from "./AbstractConversationDefinitions";
AbstractConversationUiEvents import {LogCategory, logError, logWarn} from "../../../log";
} from "./AbstractConversationDefinitions";
import * as log from "../../../log";
import {LogCategory} from "../../../log";
import {AbstractConversationController} from "./AbstractConversationController"; import {AbstractConversationController} from "./AbstractConversationController";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
import { import {
@ -147,7 +144,7 @@ export class PrivateConversationController extends AbstractConversationControlle
private handleConversationClose(event: PrivateConversationUIEvents["action_close_chat"]) { private handleConversationClose(event: PrivateConversationUIEvents["action_close_chat"]) {
const conversation = this.conversationManager?.findConversation(event.chatId); const conversation = this.conversationManager?.findConversation(event.chatId);
if(!conversation) { if(!conversation) {
log.error(LogCategory.CLIENT, tr("Tried to close a not existing private conversation with id %s"), event.chatId); logError(LogCategory.CLIENT, tr("Tried to close a not existing private conversation with id %s"), event.chatId);
return; return;
} }
@ -167,7 +164,7 @@ export class PrivateConversationController extends AbstractConversationControlle
} }
this.connection.serverConnection.send_command("clientchatcomposing", { clid: clientId }).catch(error => { this.connection.serverConnection.send_command("clientchatcomposing", { clid: clientId }).catch(error => {
log.warn(LogCategory.CHAT, tr("Failed to send chat composing to server for chat %d: %o"), clientId, error); logWarn(LogCategory.CHAT, tr("Failed to send chat composing to server for chat %d: %o"), clientId, error);
}); });
} }
} }

View file

@ -1,13 +1,12 @@
import * as React from "react"; import * as React from "react";
import {useContext, useEffect, useState} from "react";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import { import {
PrivateConversationInfo, PrivateConversationInfo,
PrivateConversationUIEvents PrivateConversationUIEvents
} from "tc-shared/ui/frames/side/PrivateConversationDefinitions"; } from "tc-shared/ui/frames/side/PrivateConversationDefinitions";
import {ConnectionHandler} from "tc-shared/ConnectionHandler";
import {ContextDivider} from "tc-shared/ui/react-elements/ContextDivider"; import {ContextDivider} from "tc-shared/ui/react-elements/ContextDivider";
import {ConversationPanel} from "./AbstractConversationRenderer"; import {ConversationPanel} from "./AbstractConversationRenderer";
import {useContext, useEffect, useState} from "react";
import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots";
import {AvatarRenderer} from "tc-shared/ui/react-elements/Avatar"; import {AvatarRenderer} from "tc-shared/ui/react-elements/Avatar";
import {TimestampRenderer} from "tc-shared/ui/react-elements/TimestampRenderer"; import {TimestampRenderer} from "tc-shared/ui/react-elements/TimestampRenderer";

View file

@ -7,7 +7,10 @@ import {
ChannelVideoEvents, ChannelVideoEvents,
ChannelVideoInfo, ChannelVideoInfo,
ChannelVideoStreamState, ChannelVideoStreamState,
kLocalVideoId, makeVideoAutoplay, VideoStreamState, VideoSubscribeInfo kLocalVideoId,
makeVideoAutoplay,
VideoStreamState,
VideoSubscribeInfo
} from "tc-shared/ui/frames/video/Definitions"; } from "tc-shared/ui/frames/video/Definitions";
import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable} from "tc-shared/ui/react-elements/i18n";
import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots";

View file

@ -1,5 +1,4 @@
import * as log from "../log"; import {LogCategory, logDebug, logWarn} from "../log";
import {LogCategory} from "../log";
import {ChannelEntry} from "../tree/Channel"; import {ChannelEntry} from "../tree/Channel";
import {ClientEntry} from "../tree/Client"; import {ClientEntry} from "../tree/Client";
import {htmlEscape} from "../ui/frames/chat"; import {htmlEscape} from "../ui/frames/chat";
@ -47,7 +46,7 @@ function generate_client_open(properties: ClientProperties) : string {
try { try {
result = result + "client-unique-id='" + encodeURIComponent(properties.client_unique_id) + "' "; result = result + "client-unique-id='" + encodeURIComponent(properties.client_unique_id) + "' ";
} catch(error) { } catch(error) {
console.warn(tr("Failed to generate client tag attribute 'client-unique-id': %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to generate client tag attribute 'client-unique-id': %o"), error);
} }
} }
@ -55,7 +54,7 @@ function generate_client_open(properties: ClientProperties) : string {
try { try {
result = result + "client-name='" + encodeURIComponent(properties.client_name) + "' "; result = result + "client-name='" + encodeURIComponent(properties.client_name) + "' ";
} catch(error) { } catch(error) {
console.warn(tr("Failed to generate client tag attribute 'client-name': %o"), error); logWarn(LogCategory.GENERAL, tr("Failed to generate client tag attribute 'client-name': %o"), error);
} }
} }
@ -161,7 +160,7 @@ export namespace callbacks {
if(!client) { if(!client) {
/* we may should open a "offline" menu? */ /* we may should open a "offline" menu? */
log.debug(LogCategory.GENERAL, "Failed to resolve client from html tag. Client id: %o, Client unique id: %o, Client name: %o", logDebug(LogCategory.GENERAL, "Failed to resolve client from html tag. Client id: %o, Client unique id: %o, Client name: %o",
client_id, client_id,
client_unique_id, client_unique_id,
decodeURIComponent(element.attr("client-name")) decodeURIComponent(element.attr("client-name"))

View file

@ -1,7 +1,6 @@
import * as loader from "tc-loader"; import * as loader from "tc-loader";
import * as moment from "moment"; import * as moment from "moment";
import * as log from "../log"; import {LogCategory, logError, logTrace} from "../log";
import {LogCategory} from "../log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
export function setupJSRender() : boolean { export function setupJSRender() : boolean {
@ -28,9 +27,9 @@ export function setupJSRender() : boolean {
$(".jsrender-template").each((idx, _entry) => { $(".jsrender-template").each((idx, _entry) => {
if(!$.templates(_entry.id, _entry.innerHTML)) { if(!$.templates(_entry.id, _entry.innerHTML)) {
log.error(LogCategory.GENERAL, tr("Failed to setup cache for js renderer template %s!"), _entry.id); logError(LogCategory.GENERAL, tr("Failed to setup cache for js renderer template %s!"), _entry.id);
} else } else
log.trace(LogCategory.GENERAL, tr("Successfully loaded jsrender template %s"), _entry.id); logTrace(LogCategory.GENERAL, tr("Successfully loaded jsrender template %s"), _entry.id);
}); });
return true; return true;
} }

View file

@ -1,6 +1,5 @@
import {createModal} from "../../ui/elements/Modal"; import {createModal} from "../../ui/elements/Modal";
import * as log from "../../log"; import {LogCategory, logError} from "../../log";
import {LogCategory} from "../../log";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
function format_date(date: number) { function format_date(date: number) {
@ -34,7 +33,7 @@ export function spawnAbout() {
(window as any).native.client_version().then(version => { (window as any).native.client_version().then(version => {
connectModal.htmlTag.find(".version-client").text(version); connectModal.htmlTag.find(".version-client").text(version);
}).catch(error => { }).catch(error => {
log.error(LogCategory.GENERAL, tr("Failed to load client version: %o"), error); logError(LogCategory.GENERAL, tr("Failed to load client version: %o"), error);
connectModal.htmlTag.find(".version-client").text("unknown"); connectModal.htmlTag.find(".version-client").text("unknown");
}); });
} }

View file

@ -1,7 +1,8 @@
//TODO: Test if we could render this image and not only the browser by knowing the type. //TODO: Test if we could render this image and not only the browser by knowing the type.
import {createErrorModal, createModal} from "../../ui/elements/Modal"; import {createErrorModal, createModal} from "../../ui/elements/Modal";
import {tra, tr} from "../../i18n/localize"; import {tr, tra} from "../../i18n/localize";
import {arrayBufferBase64} from "../../utils/buffers"; import {arrayBufferBase64} from "../../utils/buffers";
import {LogCategory, logError, logTrace} from "tc-shared/log";
export function spawnAvatarUpload(callback_data: (data: ArrayBuffer | undefined | null) => any) { export function spawnAvatarUpload(callback_data: (data: ArrayBuffer | undefined | null) => any) {
const modal = createModal({ const modal = createModal({
@ -41,7 +42,7 @@ export function spawnAvatarUpload(callback_data: (data: ArrayBuffer | undefined
input_node.multiple = false; input_node.multiple = false;
modal.htmlTag.find(".file-inputs").on('change', event => { modal.htmlTag.find(".file-inputs").on('change', event => {
console.log("Files: %o", input_node.files); logTrace(LogCategory.CLIENT, "Files: %o", input_node.files);
const read_file = (file: File) => new Promise<string>((resolve, reject) => { const read_file = (file: File) => new Promise<string>((resolve, reject) => {
const reader = new FileReader(); const reader = new FileReader();
@ -55,13 +56,13 @@ export function spawnAvatarUpload(callback_data: (data: ArrayBuffer | undefined
const data = await read_file(input_node.files[0]); const data = await read_file(input_node.files[0]);
if (!data.startsWith("data:image/")) { if (!data.startsWith("data:image/")) {
console.error(tr("Failed to load file %s: Invalid data media type (%o)"), input_node.files[0].name, data); logError(LogCategory.FILE_TRANSFER, tr("Failed to load file %s: Invalid data media type (%o)"), input_node.files[0].name, data);
createErrorModal(tr("Icon upload failed"), tra("Failed to select avatar {}.<br>File is not an image", input_node.files[0].name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to select avatar {}.<br>File is not an image", input_node.files[0].name)).open();
return; return;
} }
const semi = data.indexOf(';'); const semi = data.indexOf(';');
const type = data.substring(11, semi); const type = data.substring(11, semi);
console.log(tr("Given image has type %s"), type); logTrace(LogCategory.CLIENT, tr("Given image has type %s"), type);
set_avatar(data.substr(semi + 8 /* 8 bytes := base64, */), type); set_avatar(data.substr(semi + 8 /* 8 bytes := base64, */), type);
})(); })();

View file

@ -1,6 +1,5 @@
import {createErrorModal, createModal} from "../../ui/elements/Modal"; import {createErrorModal, createModal} from "../../ui/elements/Modal";
import * as log from "../../log"; import {LogCategory, logError} from "../../log";
import {LogCategory} from "../../log";
import {ConnectionHandler} from "../../ConnectionHandler"; import {ConnectionHandler} from "../../ConnectionHandler";
import {base64_encode_ab} from "../../utils/buffers"; import {base64_encode_ab} from "../../utils/buffers";
import {spawnYesNo} from "../../ui/modal/ModalYesNo"; import {spawnYesNo} from "../../ui/modal/ModalYesNo";
@ -151,12 +150,12 @@ export function spawnAvatarList(client: ConnectionHandler) {
(username_resolve[uid] || []).forEach(e => e(undefined)); (username_resolve[uid] || []).forEach(e => e(undefined));
} }
}).catch(error => { }).catch(error => {
log.error(LogCategory.GENERAL, tr("Failed to fetch usernames from avatar names. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to fetch usernames from avatar names. Error: %o"), error);
createErrorModal(tr("Failed to fetch usernames"), tr("Failed to fetch usernames related to their avatar names"), undefined).open(); createErrorModal(tr("Failed to fetch usernames"), tr("Failed to fetch usernames related to their avatar names"), undefined).open();
}) })
}).catch(error => { }).catch(error => {
//TODO: Display no perms error //TODO: Display no perms error
log.error(LogCategory.GENERAL, tr("Failed to receive avatar list. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to receive avatar list. Error: %o"), error);
createErrorModal(tr("Failed to list avatars"), tr("Failed to receive avatar list."), undefined).open(); createErrorModal(tr("Failed to list avatars"), tr("Failed to receive avatar list."), undefined).open();
}); });
}; };

View file

@ -3,8 +3,7 @@ import {createErrorModal, createInfoModal, createModal, Modal} from "../../ui/el
import {SingleCommandHandler} from "../../connection/ConnectionBase"; import {SingleCommandHandler} from "../../connection/ConnectionBase";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import PermissionType from "../../permission/PermissionType"; import PermissionType from "../../permission/PermissionType";
import * as log from "../../log"; import {LogCategory, logError, logInfo} from "../../log";
import {LogCategory} from "../../log";
import * as tooltip from "../../ui/elements/Tooltip"; import * as tooltip from "../../ui/elements/Tooltip";
import * as htmltags from "../../ui/htmltags"; import * as htmltags from "../../ui/htmltags";
import {format_time, formatMessage} from "../../ui/frames/chat"; import {format_time, formatMessage} from "../../ui/frames/chat";
@ -322,7 +321,7 @@ function generate_dom(controller: BanListController): JQuery {
container_add_no_permissions.hide(); container_add_no_permissions.hide();
controller.permission_add().then(result => permission_add = result).catch(error => { controller.permission_add().then(result => permission_add = result).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to query ban add permissions: %o"), error); logError(LogCategory.CLIENT, tr("Failed to query ban add permissions: %o"), error);
}).then(() => { }).then(() => {
if (permission_add[0] !== permission_add[1]) { if (permission_add[0] !== permission_add[1]) {
const input_global = container_add.find(".group-global input"); const input_global = container_add.find(".group-global input");
@ -332,7 +331,7 @@ function generate_dom(controller: BanListController): JQuery {
}); });
controller.permission_edit().then(result => permission_edit = result).catch(error => { controller.permission_edit().then(result => permission_edit = result).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to query ban edit permissions: %o"), error); logError(LogCategory.CLIENT, tr("Failed to query ban edit permissions: %o"), error);
}).then(() => { }).then(() => {
if (selected_ban) update_edit_window(false); if (selected_ban) update_edit_window(false);
}); });
@ -408,7 +407,7 @@ function generate_dom(controller: BanListController): JQuery {
update_edit_window(false); update_edit_window(false);
} }
}).catch(error => { }).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to delete ban: %o"), error); logError(LogCategory.CLIENT, tr("Failed to delete ban: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message; error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message;
createErrorModal(tr("Failed to delete ban"), formatMessage(tr("Failed to delete ban. {:br:}Error: {}"), error)).open(); createErrorModal(tr("Failed to delete ban"), formatMessage(tr("Failed to delete ban. {:br:}Error: {}"), error)).open();
@ -465,7 +464,7 @@ function generate_dom(controller: BanListController): JQuery {
} }
update_ban_filter(); update_ban_filter();
}).catch(error => { }).catch(error => {
log.info(LogCategory.CLIENT, tr("Failed to update ban list: %o"), error); logInfo(LogCategory.CLIENT, tr("Failed to update ban list: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? tr("no permissions") : error.extra_message || error.message; error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? tr("no permissions") : error.extra_message || error.message;
container_ban_entries_error.show().find("a").text(tr("Failed to receive banlist: ") + error); container_ban_entries_error.show().find("a").text(tr("Failed to receive banlist: ") + error);
@ -543,7 +542,7 @@ function generate_dom(controller: BanListController): JQuery {
update_trigger_filter(); update_trigger_filter();
}).catch(error => { }).catch(error => {
log.info(LogCategory.CLIENT, tr("Failed to update trigger list: %o"), error); logInfo(LogCategory.CLIENT, tr("Failed to update trigger list: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? tr("no permissions") : error.extra_message || error.message; error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? tr("no permissions") : error.extra_message || error.message;
container_trigger_entries_error.show().find("a").text(tr("Failed to receive trigger list: ") + error); container_trigger_entries_error.show().find("a").text(tr("Failed to receive trigger list: ") + error);
@ -801,7 +800,7 @@ function generate_dom(controller: BanListController): JQuery {
createInfoModal(tr("Ban successfully edited"), tr("Your ban has been successfully edited.")).open(); createInfoModal(tr("Ban successfully edited"), tr("Your ban has been successfully edited.")).open();
}).catch(error => { }).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to edited ban: %o"), error); logError(LogCategory.CLIENT, tr("Failed to edited ban: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message; error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message;
createErrorModal(tr("Failed to edited ban"), formatMessage(tr("Failed to edited ban. {:br:}Error: {}"), error)).open(); createErrorModal(tr("Failed to edited ban"), formatMessage(tr("Failed to edited ban. {:br:}Error: {}"), error)).open();
@ -869,7 +868,7 @@ function generate_dom(controller: BanListController): JQuery {
createInfoModal(tr("Ban successfully added"), tr("Your ban has been successfully added.")).open(); createInfoModal(tr("Ban successfully added"), tr("Your ban has been successfully added.")).open();
}).catch(error => { }).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to add ban: %o"), error); logError(LogCategory.CLIENT, tr("Failed to add ban: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message; error = error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS ? "no permissions" : error.extra_message || error.message;
createErrorModal(tr("Failed to add ban"), formatMessage(tr("Failed to add ban. {:br:}Error: {}"), error)).open(); createErrorModal(tr("Failed to add ban"), formatMessage(tr("Failed to add ban. {:br:}Error: {}"), error)).open();

View file

@ -14,8 +14,7 @@ import {Regex} from "../../ui/modal/ModalConnect";
import {availableConnectProfiles} from "../../profiles/ConnectionProfile"; import {availableConnectProfiles} from "../../profiles/ConnectionProfile";
import {spawnYesNo} from "../../ui/modal/ModalYesNo"; import {spawnYesNo} from "../../ui/modal/ModalYesNo";
import {Settings, settings} from "../../settings"; import {Settings, settings} from "../../settings";
import * as log from "../../log"; import {LogCategory, logWarn} from "../../log";
import {LogCategory} from "../../log";
import * as i18nc from "../../i18n/country"; import * as i18nc from "../../i18n/country";
import {formatMessage} from "../../ui/frames/chat"; import {formatMessage} from "../../ui/frames/chat";
import {generateIconJQueryTag, getIconManager} from "tc-shared/file/Icons"; import {generateIconJQueryTag, getIconManager} from "tc-shared/file/Icons";
@ -128,7 +127,7 @@ export function spawnBookmarkModal() {
let profile = input_connect_profile.find("option[value='" + entry.connect_profile + "']"); let profile = input_connect_profile.find("option[value='" + entry.connect_profile + "']");
if (profile.length == 0) { if (profile.length == 0) {
log.warn(LogCategory.GENERAL, tr("Failed to find bookmark profile %s. Displaying default one."), entry.connect_profile); logWarn(LogCategory.GENERAL, tr("Failed to find bookmark profile %s. Displaying default one."), entry.connect_profile);
profile = input_connect_profile.find("option[value=default]"); profile = input_connect_profile.find("option[value=default]");
} }
profile.prop("selected", true); profile.prop("selected", true);
@ -365,7 +364,7 @@ export function spawnBookmarkModal() {
(selected_bookmark as Bookmark).connect_profile = id; (selected_bookmark as Bookmark).connect_profile = id;
save_bookmark(selected_bookmark); save_bookmark(selected_bookmark);
} else { } else {
log.warn(LogCategory.GENERAL, tr("Failed to change connect profile for profile %s to %s"), selected_bookmark.unique_id, id); logWarn(LogCategory.GENERAL, tr("Failed to change connect profile for profile %s to %s"), selected_bookmark.unique_id, id);
} }
}) })
} }

View file

@ -6,6 +6,7 @@ import {Translatable} from "tc-shared/ui/react-elements/i18n";
import {EventHandler, ReactEventHandler, Registry} from "tc-shared/events"; import {EventHandler, ReactEventHandler, Registry} from "tc-shared/events";
import {ClientEntry, MusicClientEntry} from "tc-shared/tree/Client"; import {ClientEntry, MusicClientEntry} from "tc-shared/tree/Client";
import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller"; import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller";
const cssStyle = require("./ModalChangeVolume.scss"); const cssStyle = require("./ModalChangeVolume.scss");
export interface VolumeChangeEvents { export interface VolumeChangeEvents {

View file

@ -1,6 +1,5 @@
import {LogCategory} from "../../log"; import {LogCategory, logWarn} from "../../log";
import {createModal, Modal} from "../../ui/elements/Modal"; import {createModal, Modal} from "../../ui/elements/Modal";
import * as log from "../../log";
import {ClientEntry} from "../../tree/Client"; import {ClientEntry} from "../../tree/Client";
import {GroupManager, GroupType} from "../../permission/GroupManager"; import {GroupManager, GroupType} from "../../permission/GroupManager";
import PermissionType from "../../permission/PermissionType"; import PermissionType from "../../permission/PermissionType";
@ -47,12 +46,12 @@ export function createServerGroupAssignmentModal(client: ClientEntry, callback:
let group_id = parseInt(entry.attr("group-id")); let group_id = parseInt(entry.attr("group-id"));
let group = client.channelTree.client.groups.findServerGroup(group_id); let group = client.channelTree.client.groups.findServerGroup(group_id);
if(!group) { if(!group) {
console.warn(tr("Could not resolve target group!")); logWarn(LogCategory.GENERAL, tr("Could not resolve target group!"));
return false; return false;
} }
let target = entry.prop("checked"); let target = entry.prop("checked");
callback([group.id], target).catch(e => { log.warn(LogCategory.GENERAL, tr("Failed to change group assignment: %o"), e)}).then(update_groups); callback([group.id], target).catch(e => { logWarn(LogCategory.GENERAL, tr("Failed to change group assignment: %o"), e)}).then(update_groups);
}); });
}); });
@ -68,7 +67,7 @@ export function createServerGroupAssignmentModal(client: ClientEntry, callback:
group_ids.push(parseInt(entry.attr("group-id"))); group_ids.push(parseInt(entry.attr("group-id")));
}); });
callback(group_ids, false).catch(e => { log.warn(LogCategory.GENERAL, tr("Failed to remove all group assignments: %o"), e)}).then(update_groups); callback(group_ids, false).catch(e => { logWarn(LogCategory.GENERAL, tr("Failed to remove all group assignments: %o"), e)}).then(update_groups);
}); });

View file

@ -13,6 +13,7 @@ import {createErrorModal, createInfoModal} from "tc-shared/ui/elements/Modal";
import {tra} from "tc-shared/i18n/localize"; import {tra} from "tc-shared/i18n/localize";
import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller"; import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller";
import {ErrorCode} from "tc-shared/connection/ErrorCode"; import {ErrorCode} from "tc-shared/connection/ErrorCode";
import {LogCategory, logError} from "tc-shared/log";
const cssStyle = require("./ModalGroupCreate.scss"); const cssStyle = require("./ModalGroupCreate.scss");
@ -348,7 +349,7 @@ function initializeGroupCreateController(connection: ConnectionHandler, events:
return; return;
} }
console.warn(tr("Failed to create group: %o"), error); logError(LogCategory.GENERAL, tr("Failed to create group: %o"), error);
createErrorModal(tr("Failed to create group"), createErrorModal(tr("Failed to create group"),
tra("Failed to create group.\n{}", stringifyError(error))).open(); tra("Failed to create group.\n{}", stringifyError(error))).open();
}); });

View file

@ -1,10 +1,10 @@
import {spawnReactModal} from "tc-shared/ui/react-elements/Modal"; import {spawnReactModal} from "tc-shared/ui/react-elements/Modal";
import {ConnectionHandler} from "tc-shared/ConnectionHandler"; import {ConnectionHandler} from "tc-shared/ConnectionHandler";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import * as React from "react";
import {useRef, useState} from "react"; import {useRef, useState} from "react";
import {Select} from "tc-shared/ui/react-elements/InputField"; import {Select} from "tc-shared/ui/react-elements/InputField";
import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable} from "tc-shared/ui/react-elements/i18n";
import * as React from "react";
import {Button} from "tc-shared/ui/react-elements/Button"; import {Button} from "tc-shared/ui/react-elements/Button";
import {GroupType} from "tc-shared/permission/GroupManager"; import {GroupType} from "tc-shared/permission/GroupManager";
import PermissionType from "tc-shared/permission/PermissionType"; import PermissionType from "tc-shared/permission/PermissionType";
@ -13,6 +13,7 @@ import {createErrorModal, createInfoModal} from "tc-shared/ui/elements/Modal";
import {tra} from "tc-shared/i18n/localize"; import {tra} from "tc-shared/i18n/localize";
import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller"; import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller";
import {ErrorCode} from "tc-shared/connection/ErrorCode"; import {ErrorCode} from "tc-shared/connection/ErrorCode";
import {LogCategory, logWarn} from "tc-shared/log";
const cssStyle = require("./ModalGroupPermissionCopy.scss"); const cssStyle = require("./ModalGroupPermissionCopy.scss");
@ -222,7 +223,7 @@ function initializeGroupPermissionCopyController(connection: ConnectionHandler,
return; return;
} }
console.warn(tr("Failed to copy group permissions: %o"), error); logWarn(LogCategory.PERMISSIONS, tr("Failed to copy group permissions: %o"), error);
createErrorModal(tr("Failed to copy group permissions"), createErrorModal(tr("Failed to copy group permissions"),
tra("Failed to copy group permissions.\n{}", stringifyError(error))).open(); tra("Failed to copy group permissions.\n{}", stringifyError(error))).open();
}); });

View file

@ -1,8 +1,7 @@
import {ConnectionHandler} from "../../ConnectionHandler"; import {ConnectionHandler} from "../../ConnectionHandler";
import PermissionType from "../../permission/PermissionType"; import PermissionType from "../../permission/PermissionType";
import {createErrorModal, createModal} from "../../ui/elements/Modal"; import {createErrorModal, createModal} from "../../ui/elements/Modal";
import * as log from "../../log"; import {LogCategory, logError, logInfo, logWarn} from "../../log";
import {LogCategory} from "../../log";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import {tra, traj} from "../../i18n/localize"; import {tra, traj} from "../../i18n/localize";
import {arrayBufferBase64} from "../../utils/buffers"; import {arrayBufferBase64} from "../../utils/buffers";
@ -106,7 +105,7 @@ export function spawnIconSelect(client: ConnectionHandler, callback_icon?: (id:
for (const icon of chunk) { for (const icon of chunk) {
const iconId = parseInt((icon.name || "").substr("icon_".length)); const iconId = parseInt((icon.name || "").substr("icon_".length));
if (Number.isNaN(iconId)) { if (Number.isNaN(iconId)) {
log.warn(LogCategory.GENERAL, tr("Received an unparsable icon within icon list (%o)"), icon); logWarn(LogCategory.GENERAL, tr("Received an unparsable icon within icon list (%o)"), icon);
continue; continue;
} }
@ -146,7 +145,7 @@ export function spawnIconSelect(client: ConnectionHandler, callback_icon?: (id:
if (error instanceof CommandResult && error.id == ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS) { if (error instanceof CommandResult && error.id == ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS) {
container_no_permissions.show(); container_no_permissions.show();
} else { } else {
log.error(LogCategory.GENERAL, tr("Failed to fetch icon list. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to fetch icon list. Error: %o"), error);
display_remote_error(tr("Failed to fetch icon list")); display_remote_error(tr("Failed to fetch icon list"));
} }
container_loading.hide(); container_loading.hide();
@ -159,7 +158,7 @@ export function spawnIconSelect(client: ConnectionHandler, callback_icon?: (id:
const selected = modal.htmlTag.find(".selected"); const selected = modal.htmlTag.find(".selected");
if (selected.length != 1) if (selected.length != 1)
console.warn(tr("UI selected icon length does not equal with 1! (%o)"), selected.length); logWarn(LogCategory.GENERAL, tr("UI selected icon length does not equal with 1! (%o)"), selected.length);
if (selected_icon < 1000) return; /* we cant delete local icons */ if (selected_icon < 1000) return; /* we cant delete local icons */
@ -168,7 +167,7 @@ export function spawnIconSelect(client: ConnectionHandler, callback_icon?: (id:
}).catch(error => { }).catch(error => {
if (error instanceof CommandResult && error.id == ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS) if (error instanceof CommandResult && error.id == ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS)
return; return;
console.warn(tr("Failed to delete icon %d: %o"), selected_icon, error); logWarn(LogCategory.GENERAL, tr("Failed to delete icon %d: %o"), selected_icon, error);
error = error instanceof CommandResult ? error.extra_message || error.message : error; error = error instanceof CommandResult ? error.extra_message || error.message : error;
@ -214,14 +213,14 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
icon.upload_state = "unset"; icon.upload_state = "unset";
const file_too_big = () => { const file_too_big = () => {
console.error(tr("Failed to load file %s: File is too big!"), file.name); logError(LogCategory.GENERAL, tr("Failed to load file %s: File is too big!"), file.name);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>The given file is too big!", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>The given file is too big!", file.name)).open();
icon.state = "error"; icon.state = "error";
}; };
if (file.size > 1024 * 1024 * 512) { if (file.size > 1024 * 1024 * 512) {
file_too_big(); file_too_big();
} else if ((file.size | 0) <= 0) { } else if ((file.size | 0) <= 0) {
console.error(tr("Failed to load file %s: Your browser does not support file sizes!"), file.name); logError(LogCategory.GENERAL, tr("Failed to load file %s: Your browser does not support file sizes!"), file.name);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Your browser does not support file sizes!", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Your browser does not support file sizes!", file.name)).open();
icon.state = "error"; icon.state = "error";
return; return;
@ -237,8 +236,7 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
reader.readAsDataURL(file); reader.readAsDataURL(file);
}); });
} catch (error) { } catch (error) {
console.log("Image failed to load (%o)", error); logError(LogCategory.CLIENT, tr("Failed to load file %s: Image failed to load: %o"), file.name, error);
console.error(tr("Failed to load file %s: Image failed to load"), file.name);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Failed to load image", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Failed to load image", file.name)).open();
icon.state = "error"; icon.state = "error";
return; return;
@ -246,7 +244,7 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
const result = reader.result as string; const result = reader.result as string;
if (typeof (result) !== "string") { if (typeof (result) !== "string") {
console.error(tr("Failed to load file %s: Result is not an media string (%o)"), file.name, result); logError(LogCategory.GENERAL, tr("Failed to load file %s: Result is not an media string (%o)"), file.name, result);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Result is not an media string", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Result is not an media string", file.name)).open();
icon.state = "error"; icon.state = "error";
return; return;
@ -256,16 +254,16 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
/* get the CRC32 sum */ /* get the CRC32 sum */
{ {
if (!result.startsWith("data:image/")) { if (!result.startsWith("data:image/")) {
console.error(tr("Failed to load file %s: Invalid data media type (%o)"), file.name, result); logError(LogCategory.GENERAL, tr("Failed to load file %s: Invalid data media type (%o)"), file.name, result);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>File is not an image", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>File is not an image", file.name)).open();
icon.state = "error"; icon.state = "error";
return; return;
} }
const semi = result.indexOf(';'); const semi = result.indexOf(';');
const type = result.substring(11, semi); const type = result.substring(11, semi);
console.log(tr("Given image has type %s"), type); logInfo(LogCategory.GENERAL, tr("Given image has type %s"), type);
if (!result.substr(semi + 1).startsWith("base64,")) { if (!result.substr(semi + 1).startsWith("base64,")) {
console.error(tr("Failed to load file %s: Mimetype isnt base64 encoded (%o)"), file.name, result.substr(semi + 1)); logError(LogCategory.GENERAL, tr("Failed to load file %s: Mimetype isn't base64 encoded (%o)"), file.name, result.substr(semi + 1));
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Decoder returned unknown result", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.<br>Decoder returned unknown result", file.name)).open();
icon.state = "error"; icon.state = "error";
return; return;
@ -285,14 +283,14 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
image.src = result; image.src = result;
}); });
} catch (error) { } catch (error) {
console.log("Image failed to load (%o)", error); logInfo(LogCategory.GENERAL, "Image failed to load (%o)", error);
console.error(tr("Failed to load file %s: Image failed to load"), file.name); logError(LogCategory.GENERAL, tr("Failed to load file %s: Image failed to load"), file.name);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.{:br:}Failed to load image", file.name)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.{:br:}Failed to load image", file.name)).open();
icon.state = "error"; icon.state = "error";
} }
const width_error = message => { const width_error = message => {
console.error(tr("Failed to load file %s: Invalid bounds: %s"), file.name, message); logError(LogCategory.GENERAL, tr("Failed to load file %s: Invalid bounds: %s"), file.name, message);
createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.{:br:}Image is too large ({})", file.name, message)).open(); createErrorModal(tr("Icon upload failed"), tra("Failed to upload icon {}.{:br:}Image is too large ({})", file.name, message)).open();
icon.state = "error"; icon.state = "error";
}; };
@ -311,7 +309,7 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
return; return;
} }
} }
console.log("Image loaded (%dx%d) %s (%s)", image.naturalWidth, image.naturalHeight, image.name, icon.icon_id); logInfo(LogCategory.GENERAL, "Image loaded (%dx%d) %s (%s)", image.naturalWidth, image.naturalHeight, image.name, icon.icon_id);
icon.image_element = () => { icon.image_element = () => {
const image = document.createElement("img"); const image = document.createElement("img");
image.src = result; image.src = result;
@ -426,7 +424,7 @@ function handle_icon_upload(file: File, client: ConnectionHandler): UploadingIco
break; break;
case FileTransferState.ERRORED: case FileTransferState.ERRORED:
log.warn(LogCategory.FILE_TRANSFER, tr("Failed to upload icon %s: %o"), icon.file.name, transfer.currentError()); logWarn(LogCategory.FILE_TRANSFER, tr("Failed to upload icon %s: %o"), icon.file.name, transfer.currentError());
bar.set_value(100); bar.set_value(100);
bar.set_error(tr("upload failed: ") + transfer.currentErrorMessage()); bar.set_error(tr("upload failed: ") + transfer.currentErrorMessage());
icon.upload_state = "error"; icon.upload_state = "error";

View file

@ -3,6 +3,7 @@ import {TeaSpeakIdentity} from "../../profiles/identities/TeamSpeakIdentity";
import * as tooltip from "../../ui/elements/Tooltip"; import * as tooltip from "../../ui/elements/Tooltip";
import {formatMessage} from "../../ui/frames/chat"; import {formatMessage} from "../../ui/frames/chat";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
import {LogCategory, logError} from "tc-shared/log";
export function spawnTeamSpeakIdentityImprove(identity: TeaSpeakIdentity, name: string): Modal { export function spawnTeamSpeakIdentityImprove(identity: TeaSpeakIdentity, name: string): Modal {
let modal: Modal; let modal: Modal;
@ -58,7 +59,6 @@ export function spawnTeamSpeakIdentityImprove(identity: TeaSpeakIdentity, name:
}, hash_rate => { }, hash_rate => {
input_hash_rate.val(hash_rate); input_hash_rate.val(hash_rate);
}).catch(error => { }).catch(error => {
console.error(error);
createErrorModal(tr("Failed to improve identity"), tr("Failed to improve identity.<br>Error:") + error).open(); createErrorModal(tr("Failed to improve identity"), tr("Failed to improve identity.<br>Error:") + error).open();
if (active) if (active)
button_start_stop.trigger('click'); button_start_stop.trigger('click');
@ -80,7 +80,6 @@ export function spawnTeamSpeakIdentityImprove(identity: TeaSpeakIdentity, name:
if (active) if (active)
button_start_stop.trigger('click'); button_start_stop.trigger('click');
}).catch(error => { }).catch(error => {
console.error(error);
createErrorModal(tr("Failed to improve identity"), tr("Failed to improve identity.<br>Error:") + error).open(); createErrorModal(tr("Failed to improve identity"), tr("Failed to improve identity.<br>Error:") + error).open();
if (active) if (active)
button_start_stop.trigger('click'); button_start_stop.trigger('click');
@ -185,7 +184,7 @@ export function spawnTeamSpeakIdentityImport(callback: (identity: TeaSpeakIdenti
}; };
file_reader.onerror = ev => { file_reader.onerror = ev => {
console.error(tr("Failed to read give identity file: %o"), ev); logError(LogCategory.IDENTITIES, tr("Failed to read give identity file: %o"), ev);
set_status(tr("Failed to read the identity file."), "error"); set_status(tr("Failed to read the identity file."), "error");
return; return;
}; };

View file

@ -3,9 +3,8 @@ import {ConnectionHandler} from "../../ConnectionHandler";
import {MusicClientEntry} from "../../tree/Client"; import {MusicClientEntry} from "../../tree/Client";
import {modal, Registry} from "../../events"; import {modal, Registry} from "../../events";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import * as log from "../../log"; import {LogCategory, logError, logWarn} from "../../log";
import {LogCategory} from "../../log"; import {tr, tra} from "../../i18n/localize";
import {tra, tr} from "../../i18n/localize";
import * as tooltip from "../../ui/elements/Tooltip"; import * as tooltip from "../../ui/elements/Tooltip";
import * as i18nc from "../../i18n/country"; import * as i18nc from "../../i18n/country";
import {find} from "../../permission/PermissionManager"; import {find} from "../../permission/PermissionManager";
@ -70,7 +69,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
status: "error", status: "error",
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to query playlist info for playlist %d: %o"), playlist_id, error); logError(LogCategory.CLIENT, tr("Failed to query playlist info for playlist %d: %o"), playlist_id, error);
}); });
}); });
@ -111,7 +110,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
key: event.key, key: event.key,
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to change playlist status %s for playlist %d: %o"), event.key, playlist_id, error); logError(LogCategory.CLIENT, tr("Failed to change playlist status %s for playlist %d: %o"), event.key, playlist_id, error);
}); });
}); });
@ -176,7 +175,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
key: event.key, key: event.key,
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to change bot setting %s: %o"), event.key, error); logError(LogCategory.CLIENT, tr("Failed to change bot setting %s: %o"), event.key, error);
}); });
}); });
} }
@ -199,7 +198,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
status: "error", status: "error",
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to query playlist general permissions for playlist %d: %o"), playlist_id, error); logError(LogCategory.CLIENT, tr("Failed to query playlist general permissions for playlist %d: %o"), playlist_id, error);
}); });
}); });
@ -224,7 +223,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
key: event.key, key: event.key,
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to set playlist general permissions for playlist %d and permission %d: %o"), playlist_id, event.key, error); logError(LogCategory.CLIENT, tr("Failed to set playlist general permissions for playlist %d and permission %d: %o"), playlist_id, event.key, error);
}); });
}); });
@ -247,7 +246,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
client_database_id: event.client_database_id, client_database_id: event.client_database_id,
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to query playlist client permissions for playlist %d and client %d: %o"), playlist_id, client_id, error); logError(LogCategory.CLIENT, tr("Failed to query playlist client permissions for playlist %d and client %d: %o"), playlist_id, client_id, error);
}); });
}); });
@ -277,7 +276,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
client_database_id: client_id, client_database_id: client_id,
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to set playlist client permissions for playlist %d, permission %d and client id %d: %o"), playlist_id, event.key, client_id, error); logError(LogCategory.CLIENT, tr("Failed to set playlist client permissions for playlist %d, permission %d and client id %d: %o"), playlist_id, event.key, client_id, error);
}); });
}); });
@ -301,7 +300,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
status: "error", status: "error",
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to query special client list for playlist %d: %o"), playlist_id, error); logError(LogCategory.CLIENT, tr("Failed to query special client list for playlist %d: %o"), playlist_id, error);
}) })
}); });
@ -344,7 +343,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
status: "error", status: "error",
error_msg: error_msg(error) error_msg: error_msg(error)
}); });
log.error(LogCategory.CLIENT, tr("Failed to lookup search text \"%s\": %o"), text, error); logError(LogCategory.CLIENT, tr("Failed to lookup search text \"%s\": %o"), text, error);
}); });
}); });
@ -375,7 +374,7 @@ function permission_controller(event_registry: Registry<modal.music_manage>, bot
error_msg: error_msg(error), error_msg: error_msg(error),
permission_name: event.permission_name permission_name: event.permission_name
}); });
log.error(LogCategory.CLIENT, tr("Failed to execute permfind for permission %s: %o"), event.permission_name, error); logError(LogCategory.CLIENT, tr("Failed to execute permfind for permission %s: %o"), event.permission_name, error);
}); });
}); });
} }
@ -911,7 +910,6 @@ function build_settings_container(event_registry: Registry<modal.music_manage>,
input.on("keyup", event => event.key === "Enter" && input.trigger("focusout")); input.on("keyup", event => event.key === "Enter" && input.trigger("focusout"));
input.on("change", event => { input.on("change", event => {
const value = parseInt(input.val() as string); const value = parseInt(input.val() as string);
console.log(value);
if (isNaN(value)) return; if (isNaN(value)) return;
update_value(tr("applying...")); update_value(tr("applying..."));
@ -1741,7 +1739,7 @@ function build_permission_container(event_registry: Registry<modal.music_manage>
let hide_indicator = false; let hide_indicator = false;
if (typeof permission_needed_name !== "string") { if (typeof permission_needed_name !== "string") {
log.warn(LogCategory.GENERAL, tr("Missing permission needed mapping for %s"), permission_name); logWarn(LogCategory.GENERAL, tr("Missing permission needed mapping for %s"), permission_name);
return; return;
} }

View file

@ -162,8 +162,7 @@ import {CommandResult, QueryListEntry} from "../../connection/ServerConnectionDe
import {SingleCommandHandler} from "../../connection/ConnectionBase"; import {SingleCommandHandler} from "../../connection/ConnectionBase";
import {copyToClipboard} from "../../utils/helpers"; import {copyToClipboard} from "../../utils/helpers";
import {spawnYesNo} from "../../ui/modal/ModalYesNo"; import {spawnYesNo} from "../../ui/modal/ModalYesNo";
import * as log from "../../log"; import {LogCategory, logError} from "../../log";
import {LogCategory} from "../../log";
import PermissionType from "../../permission/PermissionType"; import PermissionType from "../../permission/PermissionType";
import {ConnectionHandler} from "../../ConnectionHandler"; import {ConnectionHandler} from "../../ConnectionHandler";
import {spawnQueryCreate, spawnQueryCreated} from "../../ui/modal/ModalQuery"; import {spawnQueryCreate, spawnQueryCreated} from "../../ui/modal/ModalQuery";
@ -265,12 +264,12 @@ export function spawnQueryManage(client: ConnectionHandler) {
set_error(tr("No permissions")); set_error(tr("No permissions"));
return; return;
} }
log.error(LogCategory.CLIENT, tr("Failed to request the query list: %o"), error); logError(LogCategory.CLIENT, tr("Failed to request the query list: %o"), error);
set_error(tr("Failed to request list")); set_error(tr("Failed to request list"));
}); });
}).catch(error => { }).catch(error => {
button_update.prop('disabled', false); button_update.prop('disabled', false);
log.error(LogCategory.CLIENT, tr("Failed to get own virtual server id: %o"), error); logError(LogCategory.CLIENT, tr("Failed to get own virtual server id: %o"), error);
set_error(tr("Failed to query server id")); set_error(tr("Failed to query server id"));
}); });
}; };

View file

@ -124,7 +124,7 @@ function apply_general_listener(tag: JQuery, server: ServerEntry, properties: Se
icon_node.children().remove(); icon_node.children().remove();
icon_node.append(generateIconJQueryTag(getIconManager().resolveIcon(id, server.properties.virtualserver_unique_identifier, server.channelTree.client.handlerId))); icon_node.append(generateIconJQueryTag(getIconManager().resolveIcon(id, server.properties.virtualserver_unique_identifier, server.channelTree.client.handlerId)));
console.log("Selected icon ID: %d", id); logTrace(LogCategory.GENERAL, "Selected icon ID: %d", id);
properties.virtualserver_icon_id = id; properties.virtualserver_icon_id = id;
callback_valid(undefined); //Toggle save button update callback_valid(undefined); //Toggle save button update
}, properties.virtualserver_icon_id); }, properties.virtualserver_icon_id);
@ -135,7 +135,7 @@ function apply_general_listener(tag: JQuery, server: ServerEntry, properties: Se
icon_node.children().remove(); icon_node.children().remove();
icon_node.append(generateIconJQueryTag(getIconManager().resolveIcon(0, server.properties.virtualserver_unique_identifier))); icon_node.append(generateIconJQueryTag(getIconManager().resolveIcon(0, server.properties.virtualserver_unique_identifier)));
console.log("Remove server icon"); logTrace(LogCategory.GENERAL, "Remove server icon");
properties.virtualserver_icon_id = 0; properties.virtualserver_icon_id = 0;
callback_valid(undefined); //Toggle save button update callback_valid(undefined); //Toggle save button update
}); });
@ -218,7 +218,7 @@ function apply_general_listener(tag: JQuery, server: ServerEntry, properties: Se
}; };
input.on('change', event => { input.on('change', event => {
console.log(tr("Welcome message edited: %o"), input.val()); logTrace(LogCategory.GENERAL, tr("Welcome message edited: %o"), input.val());
properties.virtualserver_welcomemessage = input.val() as string; properties.virtualserver_welcomemessage = input.val() as string;
callback_valid(undefined); //Toggle save button update callback_valid(undefined); //Toggle save button update
}).prop("disabled", !permission).firstParent(".input-boxed").toggleClass("disabled", !permission); }).prop("disabled", !permission).firstParent(".input-boxed").toggleClass("disabled", !permission);

View file

@ -6,8 +6,7 @@ import {
import {ServerEntry} from "../../tree/Server"; import {ServerEntry} from "../../tree/Server";
import {CommandResult} from "../../connection/ServerConnectionDeclaration"; import {CommandResult} from "../../connection/ServerConnectionDeclaration";
import {createErrorModal, createModal, Modal} from "../../ui/elements/Modal"; import {createErrorModal, createModal, Modal} from "../../ui/elements/Modal";
import * as log from "../../log"; import {LogCategory, logWarn} from "../../log";
import {LogCategory} from "../../log";
import * as tooltip from "../../ui/elements/Tooltip"; import * as tooltip from "../../ui/elements/Tooltip";
import * as i18nc from "../../i18n/country"; import * as i18nc from "../../i18n/country";
import {format_time, formatMessage} from "../../ui/frames/chat"; import {format_time, formatMessage} from "../../ui/frames/chat";
@ -40,7 +39,7 @@ export function openServerInfo(server: ServerEntry) {
update_callbacks = []; update_callbacks = [];
update_values(); update_values();
}).catch(error => { }).catch(error => {
log.warn(LogCategory.CLIENT, tr("Failed to refresh server properties: %o"), error); logWarn(LogCategory.CLIENT, tr("Failed to refresh server properties: %o"), error);
if (error instanceof CommandResult) if (error instanceof CommandResult)
error = error.extra_message || error.message; error = error.extra_message || error.message;
createErrorModal(tr("Refresh failed"), formatMessage(tr("Failed to refresh server properties.{:br:}Error: {}"), error)).open(); createErrorModal(tr("Refresh failed"), formatMessage(tr("Failed to refresh server properties.{:br:}Error: {}"), error)).open();

View file

@ -9,8 +9,7 @@ import {IdentitifyType} from "tc-shared/profiles/Identity";
import {TeaForumIdentity} from "tc-shared/profiles/identities/TeaForumIdentity"; import {TeaForumIdentity} from "tc-shared/profiles/identities/TeaForumIdentity";
import {TeaSpeakIdentity} from "tc-shared/profiles/identities/TeamSpeakIdentity"; import {TeaSpeakIdentity} from "tc-shared/profiles/identities/TeamSpeakIdentity";
import {NameIdentity} from "tc-shared/profiles/identities/NameIdentity"; import {NameIdentity} from "tc-shared/profiles/identities/NameIdentity";
import * as log from "tc-shared/log"; import {LogCategory, logDebug, logError, logTrace, logWarn} from "tc-shared/log";
import {LogCategory} from "tc-shared/log";
import * as i18n from "tc-shared/i18n/localize"; import * as i18n from "tc-shared/i18n/localize";
import {RepositoryTranslation, TranslationRepository} from "tc-shared/i18n/localize"; import {RepositoryTranslation, TranslationRepository} from "tc-shared/i18n/localize";
import * as events from "tc-shared/events"; import * as events from "tc-shared/events";
@ -28,7 +27,6 @@ import * as ReactDOM from "react-dom";
import {NotificationSettings} from "tc-shared/ui/modal/settings/Notifications"; import {NotificationSettings} from "tc-shared/ui/modal/settings/Notifications";
import {initialize_audio_microphone_controller, MicrophoneSettingsEvents} from "tc-shared/ui/modal/settings/Microphone"; import {initialize_audio_microphone_controller, MicrophoneSettingsEvents} from "tc-shared/ui/modal/settings/Microphone";
import {MicrophoneSettings} from "tc-shared/ui/modal/settings/MicrophoneRenderer"; import {MicrophoneSettings} from "tc-shared/ui/modal/settings/MicrophoneRenderer";
import {server_connections} from "tc-shared/ConnectionManager";
export function spawnSettingsModal(default_page?: string): Modal { export function spawnSettingsModal(default_page?: string): Modal {
let modal: Modal; let modal: Modal;
@ -110,7 +108,7 @@ function settings_general_application(container: JQuery, modal: Modal) {
select.on('change', event => { select.on('change', event => {
const value = parseInt(select.val() as string); const value = parseInt(select.val() as string);
settings.setValue(Settings.KEY_FONT_SIZE, value); settings.setValue(Settings.KEY_FONT_SIZE, value);
console.log("Changed font size to %dpx", value); logDebug(LogCategory.GENERAL, "Changed font size to %dpx", value);
}); });
} }
@ -296,7 +294,7 @@ function settings_general_language(container: JQuery, modal: Modal) {
tag.insertAfter(repo_tag); tag.insertAfter(repo_tag);
} }
}).then(() => tag_loading.hide()).catch(error => { }).then(() => tag_loading.hide()).catch(error => {
console.error(error); logError(LogCategory.GENERAL, "Enexpected error happened: %o", error);
/* this should NEVER happen */ /* this should NEVER happen */
}) })
} }
@ -429,7 +427,7 @@ function settings_general_chat(container: JQuery, modal: Modal) {
container_slider.on('change', event => { container_slider.on('change', event => {
const value = parseInt(container_slider.attr("value") as string); const value = parseInt(container_slider.attr("value") as string);
settings.setValue(Settings.KEY_ICON_SIZE, value); settings.setValue(Settings.KEY_ICON_SIZE, value);
console.log("Changed icon size to %sem", (value / 100).toFixed(2)); logDebug(LogCategory.GENERAL, "Changed icon size to %sem", (value / 100).toFixed(2));
set_icon_size((value / 100).toFixed(2) + "em"); set_icon_size((value / 100).toFixed(2) + "em");
}); });
@ -500,12 +498,12 @@ function settings_audio_speaker(container: JQuery, modal: Modal) {
tag.addClass("selected"); tag.addClass("selected");
aplayer.set_device(device ? device.device_id : null).then(() => { aplayer.set_device(device ? device.device_id : null).then(() => {
console.debug(tr("Changed default speaker device")); logDebug(LogCategory.AUDIO, tr("Changed default speaker device"));
}).catch((error) => { }).catch((error) => {
_old.addClass("selected"); _old.addClass("selected");
tag.removeClass("selected"); tag.removeClass("selected");
console.error(tr("Failed to change speaker to device %o: %o"), device, error); logError(LogCategory.AUDIO, tr("Failed to change speaker to device %o: %o"), device, error);
createErrorModal(tr("Failed to change speaker"), formatMessage(tr("Failed to change the speaker device to the target speaker{:br:}{}"), error)).open(); createErrorModal(tr("Failed to change speaker"), formatMessage(tr("Failed to change the speaker device to the target speaker{:br:}{}"), error)).open();
}); });
}); });
@ -521,7 +519,7 @@ function settings_audio_speaker(container: JQuery, modal: Modal) {
if (typeof (error) === "string") if (typeof (error) === "string")
contianer_error.text(error).show(); contianer_error.text(error).show();
console.log(tr("Failed to query available speaker devices: %o"), error); logDebug(LogCategory.GENERAL, tr("Failed to query available speaker devices: %o"), error);
contianer_error.text(tr("Errors occurred (View console)")).show(); contianer_error.text(tr("Errors occurred (View console)")).show();
}); });
}; };
@ -533,7 +531,7 @@ function settings_audio_speaker(container: JQuery, modal: Modal) {
try { try {
update_devices(); update_devices();
} catch (error) { } catch (error) {
console.error(tr("Failed to build new speaker device list: %o"), error); logError(LogCategory.GENERAL, tr("Failed to build new speaker device list: %o"), error);
} }
button_update.prop("disabled", false); button_update.prop("disabled", false);
}); });
@ -649,7 +647,7 @@ function settings_audio_sounds(contianer: JQuery, modal: Modal) {
tag_input_muted.on('change', event => { tag_input_muted.on('change', event => {
const volume = tag_input_muted.prop("checked") ? 1 : 0; const volume = tag_input_muted.prop("checked") ? 1 : 0;
sound.set_sound_volume(_sound, volume); sound.set_sound_volume(_sound, volume);
console.log(tr("Changed sound volume to %o for sound %o"), volume, _sound); logDebug(LogCategory.GENERAL, tr("Changed sound volume to %o for sound %o"), volume, _sound);
}); });
return tag; return tag;
@ -710,7 +708,7 @@ export namespace modal_settings {
event_registry.on("delete-profile", event => { event_registry.on("delete-profile", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("delete-profile-result", event.profile_id, tr("Unknown profile")); send_error("delete-profile-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -753,7 +751,7 @@ export namespace modal_settings {
event_registry.on("query-profile", event => { event_registry.on("query-profile", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("query-profile-result", event.profile_id, tr("Unknown profile")); send_error("query-profile-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -768,7 +766,7 @@ export namespace modal_settings {
event_registry.on("set-default-profile", event => { event_registry.on("set-default-profile", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("set-default-profile-result", event.profile_id, tr("Unknown profile")); send_error("set-default-profile-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -784,7 +782,7 @@ export namespace modal_settings {
event_registry.on("set-profile-name", event => { event_registry.on("set-profile-name", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("set-profile-name-result", event.profile_id, tr("Unknown profile")); send_error("set-profile-name-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -801,7 +799,7 @@ export namespace modal_settings {
event_registry.on("set-default-name", event => { event_registry.on("set-default-name", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("set-default-name-result", event.profile_id, tr("Unknown profile")); send_error("set-default-name-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -818,7 +816,7 @@ export namespace modal_settings {
event_registry.on("set-identity-name-name", event => { event_registry.on("set-identity-name-name", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("set-identity-name-name-result", event.profile_id, tr("Unknown profile")); send_error("set-identity-name-name-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -839,7 +837,7 @@ export namespace modal_settings {
event_registry.on("query-profile-validity", event => { event_registry.on("query-profile-validity", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("query-profile-validity-result", event.profile_id, tr("Unknown profile")); send_error("query-profile-validity-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -854,7 +852,7 @@ export namespace modal_settings {
event_registry.on("query-identity-teamspeak", event => { event_registry.on("query-identity-teamspeak", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("query-identity-teamspeak-result", event.profile_id, tr("Unknown profile")); send_error("query-identity-teamspeak-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -888,7 +886,7 @@ export namespace modal_settings {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
return; return;
} }
@ -899,7 +897,7 @@ export namespace modal_settings {
event_registry.on("generate-identity-teamspeak", event => { event_registry.on("generate-identity-teamspeak", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
send_error("generate-identity-teamspeak-result", event.profile_id, tr("Unknown profile")); send_error("generate-identity-teamspeak-result", event.profile_id, tr("Unknown profile"));
return; return;
} }
@ -916,11 +914,11 @@ export namespace modal_settings {
level: level level: level
}); });
}).catch(error => { }).catch(error => {
console.error(tr("Failed to calculate level for a new identity. Error object: %o"), error); logError(LogCategory.GENERAL, tr("Failed to calculate level for a new identity. Error object: %o"), error);
send_error("generate-identity-teamspeak-result", event.profile_id, tr("failed to calculate level: ") + error); send_error("generate-identity-teamspeak-result", event.profile_id, tr("failed to calculate level: ") + error);
}) })
}).catch(error => { }).catch(error => {
console.error(tr("Failed to generate a new identity. Error object: %o"), error); logError(LogCategory.GENERAL, tr("Failed to generate a new identity. Error object: %o"), error);
send_error("generate-identity-teamspeak-result", event.profile_id, tr("failed to generate identity: ") + error); send_error("generate-identity-teamspeak-result", event.profile_id, tr("failed to generate identity: ") + error);
}); });
}); });
@ -928,7 +926,7 @@ export namespace modal_settings {
event_registry.on("import-identity-teamspeak", event => { event_registry.on("import-identity-teamspeak", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
return; return;
} }
@ -937,7 +935,7 @@ export namespace modal_settings {
profiles.mark_need_save(); profiles.mark_need_save();
identity.level().catch(error => { identity.level().catch(error => {
console.error(tr("Failed to calculate level for a new imported identity. Error object: %o"), error); logError(LogCategory.GENERAL, tr("Failed to calculate level for a new imported identity. Error object: %o"), error);
return Promise.resolve(undefined); return Promise.resolve(undefined);
}).then(level => { }).then(level => {
event_registry.fire_react("import-identity-teamspeak-result", { event_registry.fire_react("import-identity-teamspeak-result", {
@ -952,7 +950,7 @@ export namespace modal_settings {
event_registry.on("improve-identity-teamspeak-level", event => { event_registry.on("improve-identity-teamspeak-level", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
return; return;
} }
@ -968,7 +966,7 @@ export namespace modal_settings {
new_level: level new_level: level
}); });
}).catch(error => { }).catch(error => {
log.error(LogCategory.CLIENT, tr("Failed to calculate identity level after improvement (%o)"), error); logError(LogCategory.CLIENT, tr("Failed to calculate identity level after improvement (%o)"), error);
}); });
}); });
}); });
@ -976,7 +974,7 @@ export namespace modal_settings {
event_registry.on("export-identity-teamspeak", event => { event_registry.on("export-identity-teamspeak", event => {
const profile = profiles.findConnectProfile(event.profile_id); const profile = profiles.findConnectProfile(event.profile_id);
if (!profile) { if (!profile) {
log.warn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id); logWarn(LogCategory.CLIENT, tr("Received profile event with unknown profile id (event: %s, id: %s)"), event.type, event.profile_id);
return; return;
} }
@ -993,7 +991,7 @@ export namespace modal_settings {
element[0].click(); element[0].click();
element.remove(); element.remove();
}).catch(error => { }).catch(error => {
console.error(error); logError(LogCategory.IDENTITIES, tr("Failed to export identity: %o"), error);
createErrorModal(tr("Failed to export identity"), tr("Failed to export and save identity.<br>Error: ") + error).open(); createErrorModal(tr("Failed to export identity"), tr("Failed to export and save identity.<br>Error: ") + error).open();
}); });
}); });
@ -1119,7 +1117,7 @@ export namespace modal_settings {
}); });
event_registry.on(["set-default-name-result", "set-profile-name-result", "set-identity-name-name-result", "generate-identity-teamspeak-result"], event => { event_registry.on(["set-default-name-result", "set-profile-name-result", "set-identity-name-name-result", "generate-identity-teamspeak-result"], event => {
if (!('status' in event) || !('profile_id' in event)) { if (!('status' in event) || !('profile_id' in event)) {
log.warn(LogCategory.CLIENT, tr("Profile status watcher encountered an unuseal event!")); logWarn(LogCategory.CLIENT, tr("Profile status watcher encountered an unuseal event!"));
return; return;
} }
if ((event as any).status !== "success") return; if ((event as any).status !== "success") return;
@ -1807,7 +1805,7 @@ function settings_identity_forum(container: JQuery, modal: Modal, update_profile
forum.login(input_username.val() as string, input_password.val() as string, typeof (captcha) === "string" ? captcha : undefined).then(state => { forum.login(input_username.val() as string, input_password.val() as string, typeof (captcha) === "string" ? captcha : undefined).then(state => {
captcha = false; captcha = false;
console.debug(tr("Forum login result: %o"), state); logTrace(LogCategory.GENERAL, tr("Forum login result: %o"), state);
if (state.status === "success") { if (state.status === "success") {
update_state(); update_state();
update_profiles(); update_profiles();
@ -1827,15 +1825,15 @@ function settings_identity_forum(container: JQuery, modal: Modal, update_profile
captcha = ""; captcha = "";
console.log(tr("Showing captcha for site-key: %o"), state.captcha.data); logDebug(LogCategory.GENERAL, tr("Showing captcha for site-key: %o"), state.captcha.data);
forum.gcaptcha.spawn(container_captcha_g, state.captcha.data, token => { forum.gcaptcha.spawn(container_captcha_g, state.captcha.data, token => {
captcha = token; captcha = token;
console.debug(tr("Got captcha token: %o"), token); logTrace(LogCategory.GENERAL, tr("Got captcha token: %o"), token);
container_captcha_g.hide(); container_captcha_g.hide();
button_login.show(); button_login.show();
update_button_state(); update_button_state();
}).catch(error => { }).catch(error => {
console.error(tr("Failed to initialize forum captcha: %o"), error); logError(LogCategory.GENERAL, tr("Failed to initialize forum captcha: %o"), error);
container_error.text("Failed to initialize GReCaptcha! No authentication possible.").addClass("shown"); container_error.text("Failed to initialize GReCaptcha! No authentication possible.").addClass("shown");
container_captcha_g.hide(); container_captcha_g.hide();
button_login.hide(); button_login.hide();
@ -1845,7 +1843,7 @@ function settings_identity_forum(container: JQuery, modal: Modal, update_profile
container_error.text(state.error_message || tr("Unknown error")).addClass("shown"); container_error.text(state.error_message || tr("Unknown error")).addClass("shown");
} }
}).catch(error => { }).catch(error => {
console.error(tr("Failed to login within the forum. Error: %o"), error); logError(LogCategory.GENERAL, tr("Failed to login within the forum. Error: %o"), error);
createErrorModal(tr("Forum login failed."), tr("Forum login failed. Lookup the console for more information")).open(); createErrorModal(tr("Forum login failed."), tr("Forum login failed. Lookup the console for more information")).open();
}).then(() => { }).then(() => {
input_username.prop("disabled", false); input_username.prop("disabled", false);
@ -1860,7 +1858,7 @@ function settings_identity_forum(container: JQuery, modal: Modal, update_profile
{ {
container.find(".button-logout").on('click', event => { container.find(".button-logout").on('click', event => {
forum.logout().catch(error => { forum.logout().catch(error => {
console.error(tr("Failed to logout from forum: %o"), error); logError(LogCategory.IDENTITIES, tr("Failed to logout from forum: %o"), error);
createErrorModal(tr("Forum logout failed"), formatMessage(tr("Failed to logout from forum account.{:br:}Error: {}"), error)).open(); createErrorModal(tr("Forum logout failed"), formatMessage(tr("Failed to logout from forum account.{:br:}Error: {}"), error)).open();
}).then(() => { }).then(() => {
if (modal.shown) if (modal.shown)

View file

@ -8,7 +8,7 @@ import {
} from "tc-shared/ui/modal/channel-edit/Definitions"; } from "tc-shared/ui/modal/channel-edit/Definitions";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {ChannelPropertyProviders} from "tc-shared/ui/modal/channel-edit/ControllerProperties"; import {ChannelPropertyProviders} from "tc-shared/ui/modal/channel-edit/ControllerProperties";
import {LogCategory, logDebug, logError, logInfo} from "tc-shared/log"; import {LogCategory, logDebug, logError} from "tc-shared/log";
import {ChannelPropertyPermissionsProviders} from "tc-shared/ui/modal/channel-edit/ControllerPermissions"; import {ChannelPropertyPermissionsProviders} from "tc-shared/ui/modal/channel-edit/ControllerPermissions";
import {spawnReactModal} from "tc-shared/ui/react-elements/Modal"; import {spawnReactModal} from "tc-shared/ui/react-elements/Modal";
import {ChannelEditModal} from "tc-shared/ui/modal/channel-edit/Renderer"; import {ChannelEditModal} from "tc-shared/ui/modal/channel-edit/Renderer";
@ -301,7 +301,6 @@ class ChannelEditController {
}).catch(error => { }).catch(error => {
if(error instanceof CommandResult) { if(error instanceof CommandResult) {
if(error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS) { if(error.id === ErrorCode.SERVER_INSUFFICIENT_PERMISSIONS) {
console.error(error);
this.cachedChannelPermissions = { this.cachedChannelPermissions = {
state: "no-permissions", state: "no-permissions",
failedPermission: this.connection.permissions.getFailedPermission(error) failedPermission: this.connection.permissions.getFailedPermission(error)

View file

@ -1,14 +1,16 @@
import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller"; import {InternalModal} from "tc-shared/ui/react-elements/internal-modal/Controller";
import * as React from "react"; import * as React from "react";
import {useContext, useEffect, useRef, useState} from "react";
import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import { import {
ChannelEditablePermissions, ChannelEditablePermissionValue, ChannelEditablePermissions,
ChannelEditablePermissionValue,
ChannelEditableProperty, ChannelEditableProperty,
ChannelEditEvents, ChannelEditPermissionsState, ChannelEditEvents,
ChannelEditPermissionsState,
ChannelPropertyPermission ChannelPropertyPermission
} from "tc-shared/ui/modal/channel-edit/Definitions"; } from "tc-shared/ui/modal/channel-edit/Definitions";
import {useContext, useEffect, useRef, useState} from "react";
import {BoxedInputField, Select} from "tc-shared/ui/react-elements/InputField"; import {BoxedInputField, Select} from "tc-shared/ui/react-elements/InputField";
import {Switch} from "tc-shared/ui/react-elements/Switch"; import {Switch} from "tc-shared/ui/react-elements/Switch";
import {Button} from "tc-shared/ui/react-elements/Button"; import {Button} from "tc-shared/ui/react-elements/Button";

View file

@ -2,7 +2,8 @@ import {
ConnectHistoryEntry, ConnectHistoryEntry,
ConnectHistoryServerInfo, ConnectHistoryServerInfo,
ConnectProperties, ConnectProperties,
ConnectUiEvents, PropertyValidState ConnectUiEvents,
PropertyValidState
} from "tc-shared/ui/modal/connect/Definitions"; } from "tc-shared/ui/modal/connect/Definitions";
import * as React from "react"; import * as React from "react";
import {useContext, useState} from "react"; import {useContext, useState} from "react";

View file

@ -204,7 +204,7 @@ function cssVariableEditorController(events: Registry<CssEditorEvents>) {
events.fire_react("action_select_entry", {variable: undefined}); events.fire_react("action_select_entry", {variable: undefined});
events.fire_react("query_css_variables"); events.fire_react("query_css_variables");
} catch (error) { } catch (error) {
console.warn("Failed to import CSS variable values: %o", error); logWarn(LogCategory.GENERAL, "Failed to import CSS variable values: %o", error);
events.fire_react("notify_import_result", {success: false}); events.fire_react("notify_import_result", {success: false});
} }
}); });

View file

@ -163,7 +163,7 @@ const CssVariableListRenderer = (props: { events: Registry<CssEditorEvents> }) =
<div className={cssStyle.header}> <div className={cssStyle.header}>
<a><Translatable>CSS Variable list</Translatable></a> <a><Translatable>CSS Variable list</Translatable></a>
</div> </div>
<div className={cssStyle.list} onKeyPress={event => console.error(event.key)}> <div className={cssStyle.list}>
<CssVariableListBodyRenderer events={props.events}/> <CssVariableListBodyRenderer events={props.events}/>
<CssVariableListSearchRenderer events={props.events}/> <CssVariableListSearchRenderer events={props.events}/>
</div> </div>

Some files were not shown because too many files have changed in this diff Show more