chatyuk
chatyuk copied to clipboard
A simple React.js based web chat room that should be easily embed-able on a HTML page
Chatyuk!
Chatyuk! (Let chat!) is very early in its development phase. It hopes to grow up to an easy to embed multi user chatroom for any webpage.
Installation
JS code
- Run
npm install
to install required packages for development - Install browserify globally
npm install browserify -g
- Install watchify globally
npm install watchify -g
Server component
Run vagrant up
Host setup
Due to the way some of the configurations are hardcoded now, you will need to add these following 2 settings to your /etc/hosts file.
127.0.0.1 chatyuk.com
127.0.0.1 conference.chatyuk.com
Run the code
- Run
npm run-script build-components
to continuosly build the code. - In the root directory run
python -m SimpleHTTPServer
- Access the application at http://localhost:8000/public/chat.html
Run tests
- Run
npm run-script build-tests
to continuosly build the tests. - In the root directory run
python -m SimpleHTTPServer
- Access the tests at http://localhost:8000/jasmine/SpecRunner.html
- To run the acceptance tests
npm run nightwatch
Integrating into a page
- Add the application bundle to your page like and and initialize the Chatyuk app like so
<script type="text/javascript" src="path/to/scripts/bundle.js" >
<script type="text/javascript">
Chatyuk.init(document.querySelector('#chatarea'), {display_mode: 'onpage'});
</script>
- Chatyuk.init(parentElement, config); config accepts the following keys
-
display_mode
- 'onpage', the chat window floats on an existing page
- 'inpage', the chat window is embedded into the page In both cases we create a new child div to the parentElement and use that as the container for Chatyuk. This is to ensure that any children are not replaced by React.render.
-
bosh_service_url
-
chat_server
-
conference_server
Features
- Has basic emoticon support
- Detects urls and embeds
- images and gifs
- youtube videos
- vidio videos
- links into clickable links into chat window.
- Has different display modes
- in page - embed the chat window into a particular div on your page
- on page - a floating window that can be minimised a-la FB chat that can be easily added to any page
Todo
- If there is a presence conflict don't indicate that you have joined the room
RECV: <body xmlns:stream='http://etherx.jabber.org/streams' xmlns='http://jabber.org/protocol/httpbind' sid='c8883034-41b2-439f-88f8-1fc41a418ebf'><presence xmlns='jabber:client' type='error' to='[email protected]/54e7a54b-22e2-4f6b-9add-c5d09c6ce52b' from='[email protected]/test'><error type='cancel' code='409'><conflict xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error><x xmlns='http://jabber.org/protocol/muc'/></presence></body>
- Do a better job detecting when a response from the server is an error. Now we quietly fail.
"SENT: " "<body rid='358520323' xmlns='http://jabber.org/protocol/httpbind' sid='fcc2b84a-4824-4545-ab4f-e328a5308cc2'><message to='[email protected]' from='[email protected]/20f3adff-591a-4ec4-a73b-61cf15b8552c' type='groupchat' id='1' xmlns='jabber:client'><body xmlns='jabber:client'>asdf</body><x xmlns='jabber:x:event'><composing/></x></message></body>" bundle.js:200:6
"RECV: " "<body sid='fcc2b84a-4824-4545-ab4f-e328a5308cc2' xmlns:stream='http://etherx.jabber.org/streams' xmlns='http://jabber.org/protocol/httpbind'><message type='error' to='[email protected]/20f3adff-591a-4ec4-a73b-61cf15b8552c' from='[email protected]' id='1' xmlns='jabber:client'><error type='cancel'><not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></message></body>"
- When error-ed (login more then once), logout should still work.
- Update documentation
- Remove hardcoded domain names from both client and server configurations (we should be able to leave them empty)
- Chatyuk should expose an API to set a username and join a chatroom by default
- Notify user when there is a chat directed at her
- Notify in title of window
- Look at using chrome notifications if available ?
- Session management issues
- Instead of setting 3 cookies, only set 1 for session management
- Session management is flaky at times, seen more then one chatyuk cookie for the same session
- When rejoining rooms on reloadig a page, we loose all messages from the room. Maybe there is a way to get the prior messages ?
- Create a script that will run both jasmine and acceptance test headless so that we can run it on a CI
- Running nightwatch headleass - https://github.com/beatfactor/nightwatch/wiki/Running-tests-in-PhantomJS
- Add source maps to help with debugging
- Improve default style
- Scrollbar in chat window is ugly
- On Firefox when display_mode = 'inpage', the messagepane is not expanded
- Removed unused CSS in chatyuk.css file
- Websocket support
- Figure out why converse.js dumped the muc plugin ?
- https://github.com/jcbrand/converse.js/issues/307
- Implement sample server code to create a pre-bound session and integrate with comms.js
- Ruby lib to create prebound sessions
- https://github.com/skyfallsin/ruby_bosh
- Django example
- http://metajack.im/2008/10/03/getting-attached-to-strophe/
- Example of client connecting to prebound session
- https://github.com/node-xmpp/node-xmpp-client/blob/master/examples/prebind.js
- https://github.com/strophe/strophejs/blob/master/examples/prebind.html
- End obj - auto login to room based on auth from the server
- Disable the ability for clients to connect apart from getting a prebound connection from the server
- Admin controls
- control rooms from server, valid rooms vs auto created rooms
- Refactor current stylesheets - either move everything to React components or leave in stylesheet or halhway house ?
- Display roster
- UI elements for presence (when people join or leave)
- How would we set certain users as admins ?
- Identify them in the roster
- Give them the ability to ban users
- Automatically kick abusive users out of rooms
- Deps management - Use browserify-shim for strophe and linkifyjs. Stop changing code for strophe.
- Emoji/Image picker
- Add ability to set chat room name in chat window
- When I am chatting, although scrolled up, scroll the chat window down
- Add the "More chats below" ala Twitch
- Figure out best way to handle customization => themes, emoticons
- There is a DDOS vulnerability with LuaExpat 1.2 that ships with 14.04
- HTTPs ?
- Error handling for cases where the server sends back an error when you try to send a message
- comms.js in onMessage, if there is an error the messageBody will be undefined as the body element is not in the response.
Development
Adding tests
- Code should be acompanied with tests.
- If it is a new user facing feature, add an acceptance test to tests/acceptance as well.
- Add test file to jasmine/spec/ as per the structure of the actual code in the app folder. For e.g. tests for app/comms.js go into jasmine/spec/comms_spec.js, tests for app/components/message.jsx go into jasmine/spec/components/message_spec.jsx
- Add a require entry to the relevant spec file in jasmine/spec/suite.js, it should be automatically picked up by browserify and included in the specs.
Adding code
- Code entry points is app/chatyuk.jsx.
- General code goes into app/
- Add all UI related components into app/components.
- Create directories to keep commmon files together.
- Always use strict mode. Add "use strict"; to the top of your js or jsx files.
- Ensure both your code and tests pass jshint by running
npm run jshint
before committing.
React.js component structure
- Chatbox (InPageChatbox, OnPageChatbox)
- ChatBoxHead
- MessagePane
- Message
- Message
- LoginForm/LoggedInBox
- MessageBox
Notes
- Parsing links from text - http://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links
Credits
This project has borrowed/used/copied code from:
- Converse.js - https://conversejs.org/
- Strophe.js
- Twemoji awesome - http://ellekasai.github.io/twemoji-awesome/
- Linkify - https://github.com/SoapBox/jQuery-linkify