Finish draft of new chat contacts

There's probably still a lot of typos
This commit is contained in:
om 2022-08-21 21:50:23 +02:00
parent e0b37b2012
commit 911a58bd6b

View file

@ -52,6 +52,7 @@ const visible_chat_area = {'top': 60,
const typing_speed = 50; const typing_speed = 50;
var conversation_count = 0; var conversation_count = 0;
var current_dialog = null;
/// SVG 1.1 doesn't do proper text splitting into several lines. /// SVG 1.1 doesn't do proper text splitting into several lines.
/// we need to do it ourselves. /// we need to do it ourselves.
@ -84,6 +85,16 @@ function split_text_into_lines(text, upper_line_length) {
return result; 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. /// A class holding a text chat message.
/// ///
/// *ChatMessages are owned by a Dialog. /// *ChatMessages are owned by a Dialog.
@ -118,7 +129,11 @@ function TextChatMessage(message_text, is_myself) {
'width': '5%' 'width': '5%'
}); });
if(is_hyperlink(line)) {
tspan.appendChild(create_link_node(line));
} else {
tspan.appendChild(document.createTextNode(line)); tspan.appendChild(document.createTextNode(line));
}
text.appendChild(tspan); text.appendChild(tspan);
height_so_far += line_height; height_so_far += line_height;
@ -270,23 +285,36 @@ function start_chat(who) {
case 'Kæreste': case 'Kæreste':
dialog_kaereste(); dialog_kaereste();
break; break;
case 'Politiven':
dialog_politi();
break;
case 'ChatSupport':
dialog_support();
break;
case 'Nabopige':
dialog_nabopige();
break;
default: default:
alert(`kontakten ${who} er ikke implementeret endnu`); alert(`kontakten ${who} er ikke implementeret endnu`);
} }
} }
function Dialog(chat_partner) { function Dialog() {
let conversation_id = ++conversation_count; let conversation_id = ++conversation_count;
this.messages = []; this.messages = [];
this.y_shift = visible_chat_area.top; // for scrolling this.y_shift = visible_chat_area.top; // for scrolling
this.all_elements_height = 0; // also 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) { async function post_message(dialog, message, is_myself) {
if(!is_myself && dialog.messages.length) { if(!is_myself && dialog.messages.length) {
await wait(message.length * typing_speed); await wait(message.length * typing_speed);
} // first message should be instant } // first message should be instant
if(conversation_id != conversation_count) { if(!dialog.is_active()) {
return; // Do not add messages to old conversation 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 bottom = dialog.all_elements_height + dialog.y_shift;
let scroll = Math.max(0, bottom - visible_chat_area.bottom); let scroll = Math.max(0, bottom - visible_chat_area.bottom);
while(scroll > line_height) { while(scroll > line_height) {
dialog.y_shift -= line_height; dialog.scroll_by(-line_height);
scroll -= line_height; scroll -= line_height;
dialog.messages.forEach(msg => msg.shift_y_pos(dialog.y_shift));
await wait(50); 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) { this.me = async function(message, will_be_flagged) {
await wait(1500); // give me some time to read 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(); hit_send_button();
await local_message_processing(will_be_flagged); await local_message_processing(will_be_flagged);
clear_input_field(); 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 clear_input_field(); // just to be sure
let text = document.getElementById('message_input_data').firstChild; let text = document.getElementById('message_input_data').firstChild;
@ -331,6 +365,7 @@ async function type_message(message) {
await wait(typing_speed); await wait(typing_speed);
text.data += c; text.data += c;
} }
if(!dialog.is_active()) break;
await wait(20); // otherwise it's too fast 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 text_element = document.getElementById('message_status');
let indicator = text_element.childNodes[0]; let indicator = text_element.childNodes[0];
indicator.data = 'scanning for illegal content'; indicator.data = 'scanning for illegal content';
await wait(1500); await wait(200);
if(will_be_flagged) { if(will_be_flagged) {
let box = document.getElementById('message_status_box'); let box = document.getElementById('message_status_box');
text_element.setAttribute('fill', 'red'); text_element.setAttribute('fill', 'red');
box.setAttribute('fill', 'yellow'); box.setAttribute('fill', 'yellow');
indicator.data = 'Reporting suspicious content'; indicator.data = 'Reporting suspicious content';
await wait(1500); await wait(1000);
text_element.setAttribute('fill', 'white'); text_element.setAttribute('fill', 'white');
box.setAttribute('fill', 'blue'); box.setAttribute('fill', 'blue');
} }
indicator.data = 'encrypting message'; indicator.data = 'encrypting message';
await wait(200); await wait(250);
indicator.data = 'sending message'; indicator.data = 'sending message';
await wait(200); await wait(100);
indicator.data = 'message was sent'; 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() { async function dialog_ven() {
let d = new Dialog('Ven'); let d = new Dialog();
current_dialog = d;
await d.me("hej"); await d.me("hej");
await d.you("tak for sidst!"); await d.you("tak for sidst!");
await d.you('Har du hørt om den nye EU lov "ChatControl"?'); 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() { 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("Jeg har fundet nogle gamle familiebilleder fra vores ferie 10 år siden");
await d.you("Her leger du på stranden"); await d.you("Her leger du på stranden");
await d.you("(naked stick figure image here)"); await d.you("(naked stick figure image here)");
} }
async function dialog_kaereste() { async function dialog_kaereste() {
let d = new Dialog('Kæreste'); let d = new Dialog();
current_dialog = d;
await d.me('hej smukkeste'); await d.me('hej smukkeste');
await d.you('hej, jeg har lige tænkt på dig!'); await d.you('hej, jeg har lige tænkt på dig!');
await d.you('og derfor har jeg taget et sexet billede'); 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('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.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.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('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.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!'); 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!');
}
]]> ]]>
</script> </script>
<!-- [right] contact name view --> <!-- [right] contact name view -->
<g id="contact_name_box"> <g id="contact_name_box">
<rect x="300" y="0" width="300" height="50" fill="yellow" /> <rect x="300" y="0" width="300" height="50" fill="yellow" />
<polyline points="300,20 320,0 320,40" fill="blue" onclick="swipe_viewport()" /> <!-- XXX: these polyline points depend on the svg width --> <polyline points="300,20 320,0 320,40" fill="blue" onclick="swipe_viewport()" />
<text x="375" y="30" id="contact_indicator">loading...</text> <polyline points="560,20 600,20 580,0" fill="blue" onclick="scroll_up()" />
<polyline points="560,30 600,30 580,50" fill="blue" onclick="scroll_down()" />
<text x="350" y="30" id="contact_indicator">loading...</text>
</g> </g>
<!-- [right] messages view --> <!-- [right] messages view -->
@ -445,8 +544,8 @@ async function dialog_kaereste() {
<text x="15" y="75" onclick="start_chat('Ven')">Ven</text> <text x="15" y="75" onclick="start_chat('Ven')">Ven</text>
<text x="15" y="100" onclick="start_chat('Mor')">Mor</text> <text x="15" y="100" onclick="start_chat('Mor')">Mor</text>
<text x="15" y="125" onclick="start_chat('Kæreste')">Kæreste&#10084;</text> <text x="15" y="125" onclick="start_chat('Kæreste')">Kæreste&#10084;</text>
<text x="15" y="150" onclick="start_chat('Politi')">Politi</text> <text x="15" y="150" onclick="start_chat('Politiven')">Politiven</text>
<text x="15" y="175" onclick="start_chat('Tekniker')">Chat Support</text> <text x="15" y="175" onclick="start_chat('ChatSupport')">Chat Support</text>
<text x="15" y="200" onclick="start_chat('Nabopige')">nabopige</text> <text x="15" y="200" onclick="start_chat('Nabopige')">nabopige</text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 19 KiB