From 92c316e9ea0c398fb4d6cae09ae623ecd7f72d34 Mon Sep 17 00:00:00 2001 From: khlieng Date: Wed, 4 Feb 2015 02:43:49 +0100 Subject: [PATCH] Added /nick and /topic --- client/src/js/actions/server.js | 8 ++++++++ client/src/js/components/MessageInput.jsx | 19 ++++++++++++++++++- client/src/js/stores/channel.js | 7 +++++++ client/src/js/stores/message.js | 2 +- client/src/js/stores/server.js | 5 +++++ storage/user.go | 16 ++++++++++++++++ websocket_handler.go | 10 ++++++++++ 7 files changed, 65 insertions(+), 2 deletions(-) diff --git a/client/src/js/actions/server.js b/client/src/js/actions/server.js index bb987933..25926b8f 100644 --- a/client/src/js/actions/server.js +++ b/client/src/js/actions/server.js @@ -5,6 +5,7 @@ var socket = require('../socket'); var serverActions = Reflux.createActions([ 'connect', 'disconnect', + 'setNick', 'load' ]); @@ -22,4 +23,11 @@ serverActions.disconnect.preEmit = function(server) { socket.send('quit', { server: server }); }; +serverActions.setNick.preEmit = function(nick, server) { + socket.send('nick', { + server: server, + new: nick + }); +}; + module.exports = serverActions; \ No newline at end of file diff --git a/client/src/js/components/MessageInput.jsx b/client/src/js/components/MessageInput.jsx index e5479bd1..7c84db94 100644 --- a/client/src/js/components/MessageInput.jsx +++ b/client/src/js/components/MessageInput.jsx @@ -1,9 +1,11 @@ var React = require('react'); var Reflux = require('reflux'); +var channelStore = require('../stores/channel'); var selectedTabStore = require('../stores/selectedTab'); var messageActions = require('../actions/message'); var channelActions = require('../actions/channel'); +var serverActions = require('../actions/server'); var tabActions = require('../actions/tab'); function dispatchCommand(cmd, channel, server) { @@ -28,6 +30,21 @@ function dispatchCommand(cmd, channel, server) { messageActions.send('\x01ACTION ' + params.slice(1).join(' ') + '\x01', channel, server); } break; + + case 'topic': + var topic = channelStore.getTopic(server, channel); + if (topic) { + messageActions.inform(topic, server, channel); + } else { + messageActions.inform('No topic set', server, channel); + } + break; + + case 'nick': + if (params[1]) { + serverActions.setNick(params[1], server); + } + break; } } @@ -46,7 +63,7 @@ var MessageInput = React.createClass({ if (e.which === 13 && e.target.value) { var tab = this.state.selectedTab; - if (e.target.value.charAt(0) === '/') { + if (e.target.value[0] === '/') { dispatchCommand(e.target.value, tab.channel, tab.server); } else { messageActions.send(e.target.value, tab.channel, tab.server); diff --git a/client/src/js/stores/channel.js b/client/src/js/stores/channel.js index 1d70e0dc..62a67d9a 100644 --- a/client/src/js/stores/channel.js +++ b/client/src/js/stores/channel.js @@ -205,6 +205,13 @@ var channelStore = Reflux.createStore({ return []; }, + getTopic: function(server, channel) { + if (channels[server] && channels[server][channel]) { + return channels[server][channel].topic || null; + } + return null; + }, + getState: function() { return channels; } diff --git a/client/src/js/stores/message.js b/client/src/js/stores/message.js index ec502929..34534e05 100644 --- a/client/src/js/stores/message.js +++ b/client/src/js/stores/message.js @@ -73,7 +73,7 @@ var messageStore = Reflux.createStore({ to: channel, message: message, type: 'info' - }, channel); + }, channel || server); this.trigger(messages); }, diff --git a/client/src/js/stores/server.js b/client/src/js/stores/server.js index 59b72aa4..49c9f46e 100644 --- a/client/src/js/stores/server.js +++ b/client/src/js/stores/server.js @@ -28,6 +28,11 @@ var serverStore = Reflux.createStore({ tabActions.select(server); }, + setNick: function(nick, server) { + servers[server].nick = nick; + this.trigger(servers); + }, + load: function(storedServers) { _.each(storedServers, function(server) { servers[server.address] = server; diff --git a/storage/user.go b/storage/user.go index 04f8ec2d..6d28d12b 100644 --- a/storage/user.go +++ b/storage/user.go @@ -123,6 +123,22 @@ func (u User) AddChannel(channel Channel) { }) } +func (u User) SetNick(nick, address string) { + go db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("Servers")) + id := []byte(u.UUID + ":" + address) + var server Server + + json.Unmarshal(b.Get(id), &server) + server.Nick = nick + + data, _ := json.Marshal(server) + b.Put(id, data) + + return nil + }) +} + func (u User) RemoveServer(address string) { go db.Update(func(tx *bolt.Tx) error { serverID := []byte(u.UUID + ":" + address) diff --git a/websocket_handler.go b/websocket_handler.go index 3484b24f..f1aff38d 100644 --- a/websocket_handler.go +++ b/websocket_handler.go @@ -133,6 +133,16 @@ func handleWS(ws *websocket.Conn) { if irc, ok := session.getIRC(data.Server); ok { irc.Privmsg(data.To, data.Message) } + + case "nick": + var data Nick + + json.Unmarshal(req.Request, &data) + + if irc, ok := session.getIRC(data.Server); ok { + irc.Nick(data.New) + session.user.SetNick(data.New, data.Server) + } } } }