Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jberger
Last active August 10, 2018 19:42
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jberger/78d7c1649d7acbab6a94 to your computer and use it in GitHub Desktop.
Save jberger/78d7c1649d7acbab6a94 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojo::Redis2;
use experimental 'signatures';
helper redis => sub { state $r = Mojo::Redis2->new };
get '/' => 'chat';
websocket '/socket' => sub ($c, $r=$c->redis) {
$r->subscribe( 'chat' );
my $cb = $r->on( message => sub ($r, $msg, $chan) { $c->send($msg) } );
$c->on( finish => sub { $r->unsubscribe( message => $cb ) } );
$c->on( message => sub ($c, $msg) { $r->publish(chat => $msg) } );
$c->inactivity_timeout(3600);
};
app->start;
__DATA__
@@ chat.html.ep
<!DOCTYPE html>
<html>
<head><title>Mojo/Redis Chat Example</title></head>
<body>
<form onsubmit="sendChat(this.children[0]); return false"><input></form>
<div id="log"></div>
%= javascript begin
var log = document.getElementById('log');
var ws = new WebSocket('<%= url_for('socket')->to_abs %>');
ws.onmessage = function (e) { log.innerHTML = '<p>'+e.data+'</p>' + log.innerHTML };
function sendChat(input) { ws.send(input.value); input.value = '' }
% end
</body>
</html>
Copy link

ghost commented Sep 28, 2014

getting rid of jquery without adding lines if possible

Would it work? (didn't test)

-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
-$('#log').append('<p>'+e.data+'</p>')
+var log = document.getElementById('log');
+log.innerHTML = log.innerHTML + '<p>'+e.data+'</p>';

@jberger
Copy link
Author

jberger commented Sep 28, 2014

thanks yunikim! that works great!

@nicomen
Copy link

nicomen commented Sep 28, 2014

document.getElementById('log').innerHTML += '<p>' + e.data + '</p>';

@alwayssleeping
Copy link

Hey, I'm new to Mojolicious.
is $c->redis a new Mojo::Redis2 instance per transacion ?

I'm just confused because I am trying to make a chat application with different rooms i.e
websocket '/room(:room)'
$r->subscribe( $self->param('room') )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment