code: function init(globalObject, onComplete) {
      var bot = globalObject.bot;
  
      globalObject.roomState = {
          chatHistory: [],
          mediaQueue: [],
          playHistory: [],
          usersInRoom: []
      };
  
      bot.on(Types.Event.ADVANCE, onAdvance);
      bot.on(Types.Event.CHAT, onChat);
      bot.on(Types.Event.CHAT_DELETE, onChatDelete);
      bot.on(Types.Event.GRAB, onGrab);
      bot.on(Types.Event.ROOM_PLAYLIST_QUEUE_UPDATE, onRoomPlaylistQueueUpdate);
      bot.on(Types.Event.USER_LEAVE, onUserLeave);
      bot.on(Types.Event.USER_JOIN, onUserJoin);
      bot.on(Types.Event.VOTE, onVote);
  
      globalObject.roomState.findUserInRoomById = function(userID) {
          return _findUser(globalObject.roomState.usersInRoom, userID);
      };
  
      globalObject.roomState.findPlaysForContentId = function(contentID) {
          var plays = [];
          for (var i = 0; i < globalObject.roomState.playHistory.length; i++) {
              var play = globalObject.roomState.playHistory[i];
              if (play.media.contentID === contentID) {
                  plays.push(play);
              }
          }
  
          return plays;
      }
  
      populateUsers(globalObject, onComplete);
  }
docs: Initializes the state tracker by doing a couple of things:
  
  1) Connects all of the event listeners we need. This function should be called
  before registering any other event listeners at all; that will guarantee
  that these listeners are called first, and can update state that the other
  event listeners may rely on.
  2) Determines the initial state of the room via some API calls.
  
  Because asynchronous API calls are in use, it's possible to pass a callback to
  this function.
  
  @param {object} globalObject - The global object shared throughout the bot
  @param {function} onComplete - Optional. A function that will be called once the
  initialization of this module is complete.