Skip to content

Instantly share code, notes, and snippets.

@hugomd
Last active May 23, 2018 11:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hugomd/a01b116694bded3a4666fc29ee17cdda to your computer and use it in GitHub Desktop.
Save hugomd/a01b116694bded3a4666fc29ee17cdda to your computer and use it in GitHub Desktop.
const util = require("util");
const readline = require("readline");
const { JSDOM } = require("jsdom");
const { ChatManager, TokenProvider } = require("@pusher/chatkit");
const axios = require("axios");
const prompt = require("prompt");
+const ora = require('ora');
const main = async () => {
+ const spinner = ora();
try {
// Initialise prompt with an empty message
prompt.start();
prompt.message = '';
// Turn prompt.get() into a promise
const get = util.promisify(prompt.get);
// Create a schema to validate user input
const usernameSchema = [
{
description: 'Enter your username',
name: 'username',
required: true,
},
];
// Ask the user for their username and assign it to a variable
const {username} = await get(usernameSchema);
+ spinner.start('Authenticating..');
await createUser(username);
+ spinner.succeed(`Authenticated as ${username}`);
const chatManager = new ChatManager({
instanceLocator: 'YOUR_INSTANCE_LOCATOR',
userId: username,
tokenProvider: new TokenProvider({url: 'http://localhost:3001/authenticate'}),
});
+ spinner.start('Connecting to Pusher..');
const currentUser = await chatManager.connect();
+ spinner.succeed('Connected');
+ spinner.start('Fetching rooms..');
const joinableRooms = await currentUser.getJoinableRooms();
+ spinner.succeed('Fetched rooms');
const availableRooms = [...currentUser.rooms, ...joinableRooms];
console.log('Available rooms:');
availableRooms.forEach((room, index) => {
console.log(`${index} - ${room.name}`);
});
const roomSchema = [
{
description: 'Select a room',
name: 'room',
conform: v => {
if (v >= availableRooms.length) {
return false;
}
return true;
},
required: true,
},
];
const {room: chosenRoom} = await get(roomSchema);
const room = availableRooms[chosenRoom];
+ spinner.start(`Joining room ${chosenRoom}..`);
await currentUser.subscribeToRoom({
roomId: room.id,
hooks: {
onNewMessage: message => {
const {senderId, text} = message;
if (senderId === username) return;
console.log(`${senderId}: ${text}`);
},
},
messageLimit: 0,
});
+ spinner.succeed(`Joined ${room.name}`);
const input = readline.createInterface({input: process.stdin});
input.on('line', async text => {
await currentUser.sendMessage({roomId: room.id, text});
});
} catch (err) {
+ spinner.fail();
console.log(`Failed with ${err}`);
process.exit(1);
}
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment