diff --git a/chatapp.svg b/chatapp.svg index 542ff78..32e8395 100644 --- a/chatapp.svg +++ b/chatapp.svg @@ -52,6 +52,7 @@ const visible_chat_area = {'top': 60, const typing_speed = 50; var conversation_count = 0; +var current_dialog = null; /// SVG 1.1 doesn't do proper text splitting into several lines. /// we need to do it ourselves. @@ -84,6 +85,16 @@ function split_text_into_lines(text, upper_line_length) { return result; } +function is_hyperlink(str) { + return str.startsWith('http'); +} + +function create_link_node(url) { + let link = create_svg_node('a', {target:'_blank', href: url}); + link.appendChild(document.createTextNode(url)); + return link; +} + /// A class holding a text chat message. /// /// *ChatMessages are owned by a Dialog. @@ -118,7 +129,11 @@ function TextChatMessage(message_text, is_myself) { 'width': '5%' }); - tspan.appendChild(document.createTextNode(line)); + if(is_hyperlink(line)) { + tspan.appendChild(create_link_node(line)); + } else { + tspan.appendChild(document.createTextNode(line)); + } text.appendChild(tspan); height_so_far += line_height; @@ -270,23 +285,36 @@ function start_chat(who) { case 'Kæreste': dialog_kaereste(); break; + case 'Politiven': + dialog_politi(); + break; + case 'ChatSupport': + dialog_support(); + break; + case 'Nabopige': + dialog_nabopige(); + break; default: alert(`kontakten ${who} er ikke implementeret endnu`); } } -function Dialog(chat_partner) { +function Dialog() { let conversation_id = ++conversation_count; this.messages = []; this.y_shift = visible_chat_area.top; // for scrolling this.all_elements_height = 0; // also for scrolling + this.is_active = function() { + return conversation_id == conversation_count; + } + async function post_message(dialog, message, is_myself) { if(!is_myself && dialog.messages.length) { await wait(message.length * typing_speed); } // first message should be instant - if(conversation_id != conversation_count) { + if(!dialog.is_active()) { return; // Do not add messages to old conversation } @@ -299,16 +327,22 @@ function Dialog(chat_partner) { let bottom = dialog.all_elements_height + dialog.y_shift; let scroll = Math.max(0, bottom - visible_chat_area.bottom); while(scroll > line_height) { - dialog.y_shift -= line_height; + dialog.scroll_by(-line_height); scroll -= line_height; - dialog.messages.forEach(msg => msg.shift_y_pos(dialog.y_shift)); await wait(50); } } + this.scroll_by = function(change) { + this.y_shift += change; + this.messages.forEach(msg => msg.shift_y_pos(this.y_shift)); + } + this.me = async function(message, will_be_flagged) { await wait(1500); // give me some time to read - await type_message(message); + if(!this.is_active()) return; + await type_message(this, message); + if(!this.is_active()) return; hit_send_button(); await local_message_processing(will_be_flagged); clear_input_field(); @@ -320,7 +354,7 @@ function Dialog(chat_partner) { } } -async function type_message(message) { +async function type_message(dialog, message) { clear_input_field(); // just to be sure let text = document.getElementById('message_input_data').firstChild; @@ -331,6 +365,7 @@ async function type_message(message) { await wait(typing_speed); text.data += c; } + if(!dialog.is_active()) break; await wait(20); // otherwise it's too fast } } @@ -355,25 +390,34 @@ async function local_message_processing(will_be_flagged) { let text_element = document.getElementById('message_status'); let indicator = text_element.childNodes[0]; indicator.data = 'scanning for illegal content'; - await wait(1500); + await wait(200); if(will_be_flagged) { let box = document.getElementById('message_status_box'); text_element.setAttribute('fill', 'red'); box.setAttribute('fill', 'yellow'); indicator.data = 'Reporting suspicious content'; - await wait(1500); + await wait(1000); text_element.setAttribute('fill', 'white'); box.setAttribute('fill', 'blue'); } indicator.data = 'encrypting message'; - await wait(200); + await wait(250); indicator.data = 'sending message'; - await wait(200); + await wait(100); indicator.data = 'message was sent'; } +async function scroll_up() { + current_dialog.scroll_by(line_height); +} + +async function scroll_down() { + current_dialog.scroll_by(-line_height); +} + async function dialog_ven() { - let d = new Dialog('Ven'); + let d = new Dialog(); + current_dialog = d; await d.me("hej"); await d.you("tak for sidst!"); await d.you('Har du hørt om den nye EU lov "ChatControl"?'); @@ -391,14 +435,16 @@ async function dialog_ven() { } async function dialog_mor() { - let d = new Dialog('Mor'); + let d = new Dialog(); + current_dialog = d; await d.you("Jeg har fundet nogle gamle familiebilleder fra vores ferie 10 år siden"); await d.you("Her leger du på stranden"); await d.you("(naked stick figure image here)"); } async function dialog_kaereste() { - let d = new Dialog('Kæreste'); + let d = new Dialog(); + current_dialog = d; await d.me('hej smukkeste'); await d.you('hej, jeg har lige tænkt på dig!'); await d.you('og derfor har jeg taget et sexet billede'); @@ -407,20 +453,73 @@ async function dialog_kaereste() { await d.me('du ser stadig så ung ud.'); await d.me('Jeg tror at vi skal være forsigtige, fordi der er en overvågning af vores beskeder'); await d.you('What the fuck??? Hvem overvågner os?????'); - await d.me('Det kan være at chattilbyderen gør det, fordi de har lov til det'); + await d.me('Det kan være at udbyderen gør det, fordi de har lov til det'); await d.me('Men i fremtiden vil det faktisk blive forpligtende at scanne beskeder i EU\'en'); await d.me('Og hvis der er beskeder som "ligner" børneborno får politiet en kopi af dem'); await d.you('Jeg vil hellere ikke at politiet får mine nøgenbilleder. Det er min krop og jeg vil selv bestemme over det!'); } +async function dialog_politi() { + let d = new Dialog(); + current_dialog = d; + await d.me('Hej, jeg har et spørgsmål'); + await d.me('Har du hørt om chatcontrollen og hvad tænker du på det?'); + await d.you('Jeg er bekendt med det. Og det er faktisk et ret dårlig idé'); + await d.you('Problemet er at der er så mange falsk positive resultater som skal analyseres'); + await d.you('Og jeg gider ikke kigge på folkets private beskeder. Det er jo deres fortrolgie samtaler'); + await d.you('Jeg vil heller ikke at mine kolleger se hvad jeg skriver til min kæreste, kun fordi jeg hypotetisk kunne gøre noget illegalt'); + await d.you('Tænk bare hvor absurd idén er: Hvorfor aflytter vi ikke bare alle telefoner? Der vil være nogle forbrydelser vi vil opdage!'); + await d.you('Men så har vi den totale overvågning og ikke længere en fri samfund.'); +} + +async function dialog_support() { + let d = new Dialog(); + current_dialog = d; + await d.you('Velkommen til supporten af ChatWorld. Hvad kan jeg hjælpe dig med?'); + await d.me('Jeg mistænker at chatprogrammet scanner mine end-to-end krypterede beskeder. Er det rigtigt?'); + await d.you('Ja, det er en feature som cheffen ville gerne have.'); + await d.you('Der var nogle som har misbrugt chattjenesten til børneporno og det giver meget dårlig publicity og derfor har cheffen valgt at scanne end-to-end krypterede beskeder'); + await d.you('børneporno er jo en meget dårlig ting. Men jeg synes ikke at det giver mening at aflytte alle private beskeder.'); + await d.you('og teknologien kan misbruges til mange ting. Jeg som tekniker kan ikke se hvad søgefunktionen faktisk leder efter.'); + await d.you('Det kan være at det vil finde alternative politiske beskeder og markerer det som illegal selv om de ikke er.'); + await d.you('Det er en fare for demokratiet hvis fortrolige beskeder bliver scannet for ting som den politiske elite ikke ønsker'); + await d.you('Men det er desværre mit job at vedligeholde driften af overvågningen'); + await d.me('Det løser ikke mit problem. Men tak for informationen. Jeg vil se hvad jeg kan gør for at undgår overvågningen i fremtiden', true); + await d.you('Beklager at jeg kan ikke tilbyde noget bedre. Men jeg håber at du forstår situationen'); +} + +async function dialog_nabopige() { + let d = new Dialog(); + current_dialog = d; + await d.you('Gæt hvem har snart fødselsdag!'); + await d.me('Det er dig?'); + await d.you('Rigtigt! Det var måske for nemt'); + await d.me('Hvor gammel bliver du så?'); + await d.you('ti'); + await d.you('Jeg glæder mig meget til festen. Jeg har inviteret en masse mennesker'); + await d.you('Du er også inviteret!'); + await d.you('Hej, jeg vil gerne fortælle dig en hjemlighed'); + await d.you('Men jeg kan desværre ikke gøre det over chatten'); + await d.you('Fordi jeg ved at hvad vi skriver her bliver analyseret'); + await d.you('Og det vil ikke være en hjemlighed hvis der er andre læser med'); + await d.me('Du kan gerne fortælle mig hjemligheden i morgen, når jeg kommer forbi', true); + await d.me('Jeg er overrasket over at du ved noget om chatovervågningen'); + await d.you('Ja, det er meget kedeligt. Jeg har læst noget om det og jeg kan overhovet ikke lide det'); + await d.you('Det er bedre hvis man har gode voksne venner som man har tillid til end hvis der er en computer som læser alt hvad man skriver'); + await d.me('helt enig'); + await d.me('børn har også brug for hjemligheder og fortrolighed!'); +} + ]]> - - loading... + + + + loading... @@ -445,8 +544,8 @@ async function dialog_kaereste() { Ven Mor Kæreste❤ -Politi -Chat Support +Politiven +Chat Support nabopige