// Load comments at server startup
fs.readFile(state_file, (err, data) => {
if (err)
- state = { images: [], comments: [] };
+ state = { images: [] };
else
state = JSON.parse(data);
});
state.images.forEach((image) => {
socket.emit('image', image)
});
- state.comments.forEach((comment) => {
- socket.emit('comment', comment)
- });
socket.on('set-name', (name) => {
console.log("Received set-name event: " + name);
socket.request.session.name = name;
socket.request.session.save();
+ // Complete the round trip to the client
+ socket.emit('inform-name', socket.request.session.name);
});
// When any client comments, send that to all clients (including sender)
socket.on('comment', (comment) => {
+ const images = state.images;
+
+ // Send comment to clients after adding commenter's name
comment.name = socket.request.session.name;
io.emit('comment', comment);
- state.comments.push(comment);
+
+ const index = images.findIndex(image => image.id == comment.image_id);
+
+ // Before adding the comment to server's state, drop the image_id
+ delete comment.image_id;
+
+ // Now add the comment to the image, remove the image from the
+ // images array and then add it back at the end, (so it appears
+ // as the most-recently-modified image for any new clients)
+ const image = images[index];
+ image.comments.push(comment);
+ images.splice(index, 1);
+ images.push(image);
});
// Generate an image when requested
console.log(`Generating image for ${socket.request.session.name} with code=${request['code']} and prompt=${request['prompt']}`);
async function generate_image(code, prompt) {
var promise;
+
+ // Inject the target seed for the "dice" prompt once every
+ // 6 requests for a random seed (and only if the word
+ // "dice" does not appear in the prompt).
+ if (!code && !prompt.toLowerCase().includes("dice")) {
+ if (state.images.length % 6 == 0) {
+ code = 319630254;
+ }
+ }
+
if (code) {
promise = execFile(python_path, [generate_image_script, `--seed=${code}`, prompt])
} else {
child.stdout.on('data', (data) => {
const images = JSON.parse(data);
images.forEach((image) => {
- image.index = state.images.length;
+ image.id = state.images.length;
+ image.comments = [];
io.emit('image', image);
state.images.push(image);
});