96 lines
3.2 KiB
TypeScript
96 lines
3.2 KiB
TypeScript
import {format, isToday} from 'date-fns';
|
|
import {Keys} from '../keys';
|
|
import {Character, Conversation, Settings as ISettings} from './interfaces';
|
|
|
|
export function profileLink(this: void | never, character: string): string {
|
|
return `https://www.f-list.net/c/${character}`;
|
|
}
|
|
|
|
export function characterImage(this: void | never, character: string): string {
|
|
return `https://static.f-list.net/images/avatar/${character.toLowerCase()}.png`;
|
|
}
|
|
|
|
export function getByteLength(this: void | never, str: string): number {
|
|
let byteLen = 0;
|
|
for(let i = 0; i < str.length; i++) {
|
|
const c = str.charCodeAt(i);
|
|
byteLen += c < (1 << 7) ? 1 :
|
|
c < (1 << 11) ? 2 :
|
|
c < (1 << 16) ? 3 :
|
|
c < (1 << 21) ? 4 :
|
|
c < (1 << 26) ? 5 :
|
|
c < (1 << 31) ? 6 : Number.NaN;
|
|
}
|
|
return byteLen;
|
|
}
|
|
|
|
export class Settings implements ISettings {
|
|
playSound = true;
|
|
clickOpensMessage = false;
|
|
disallowedTags: string[] = [];
|
|
notifications = true;
|
|
highlight = true;
|
|
highlightWords: string[] = [];
|
|
showAvatars = true;
|
|
animatedEicons = true;
|
|
idleTimer = 0;
|
|
messageSeparators = false;
|
|
eventMessages = true;
|
|
joinMessages = false;
|
|
alwaysNotify = false;
|
|
logMessages = true;
|
|
logAds = false;
|
|
fontSize = 14;
|
|
showNeedsReply = false;
|
|
}
|
|
|
|
export class ConversationSettings implements Conversation.Settings {
|
|
notify = Conversation.Setting.Default;
|
|
highlight = Conversation.Setting.Default;
|
|
highlightWords: string[] = [];
|
|
joinMessages = Conversation.Setting.Default;
|
|
defaultHighlights = true;
|
|
}
|
|
|
|
export function formatTime(this: void | never, date: Date): string {
|
|
if(isToday(date)) return format(date, 'HH:mm');
|
|
return format(date, 'YYYY-MM-DD HH:mm');
|
|
}
|
|
|
|
export function messageToString(this: void | never, msg: Conversation.Message, timeFormatter: (date: Date) => string = formatTime): string {
|
|
let text = `[${timeFormatter(msg.time)}] `;
|
|
if(msg.type !== Conversation.Message.Type.Event)
|
|
text += (msg.type === Conversation.Message.Type.Action ? '*' : '') + msg.sender.name +
|
|
(msg.type === Conversation.Message.Type.Message ? ':' : '');
|
|
return `${text} ${msg.text}\r\n`;
|
|
}
|
|
|
|
export function getKey(e: KeyboardEvent): Keys {
|
|
return e.keyCode;
|
|
}
|
|
|
|
/*tslint:disable:no-any no-unsafe-any*///because errors can be any
|
|
export function errorToString(e: any): string {
|
|
return e instanceof Error ? e.message : e !== undefined ? e.toString() : '';
|
|
}
|
|
//tslint:enable
|
|
|
|
let messageId = 0;
|
|
|
|
export class Message implements Conversation.ChatMessage {
|
|
readonly id = ++messageId;
|
|
isHighlight = false;
|
|
|
|
constructor(readonly type: Conversation.Message.Type, readonly sender: Character, readonly text: string,
|
|
readonly time: Date = new Date()) {
|
|
if(Conversation.Message.Type[type] === undefined) throw new Error('Unknown type'); /*tslint:disable-line*/ //TODO debug code
|
|
}
|
|
}
|
|
|
|
export class EventMessage implements Conversation.EventMessage {
|
|
readonly id = ++messageId;
|
|
readonly type = Conversation.Message.Type.Event;
|
|
|
|
constructor(readonly text: string, readonly time: Date = new Date()) {
|
|
}
|
|
} |