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="https://github.com/mohangk/chatyuk/raw/master/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='cb83dc9b-f3e1-4c36-b9dc-dbd15c174f8d@chatyuk.com/54e7a54b-22e2-4f6b-9add-c5d09c6ce52b' from='testroom@conference.chatyuk.com/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='testroom@conference.chatyuk.com' from='90a3aae4-40e9-4cb5-b30b-800949f9bbff@chatyuk.com/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='90a3aae4-40e9-4cb5-b30b-800949f9bbff@chatyuk.com/20f3adff-591a-4ec4-a73b-61cf15b8552c' from='testroom@conference.chatyuk.com' 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
- 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 ?
- Implement sample server code to create a pre-bound session and integrate with comms.js
- 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
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