message: Replies to replies should use the reply text of the original reply.
diff: @@ -1510,9 +1510,10 @@ MatrixHandler.prototype._onUserQuery = Promise.coroutine(function*(req, userId)
  });
  MatrixHandler.prototype._textForReplyEvent = Promise.coroutine(function*(event, ircRoom) {
  + const REPLY_REGEX = /> <(@.*:.*)>(.*)\n\n(.*)/;
  const REPLY_NAME_MAX_LENGTH = 12;
  const eventId = event.content["m.relates_to"]["m.in_reply_to"].event_id;
  - const match = /> <(@.*:.*)>(.*)\n\n(.*)/.exec(event.content.body);
  + const match = REPLY_REGEX.exec(event.content.body);
  if (match.length === 4) {
  let rplName;
  let rplSource;
  @@ -1522,7 +1523,18 @@ MatrixHandler.prototype._textForReplyEvent = Promise.coroutine(function*(event,
  try {
  const eventContent = yield this.ircBridge.getAppServiceBridge().getIntent().getEvent(event.room_id, eventId);
  rplName = eventContent.sender;
  - rplSource = eventContent.content.body.substr(0, EVENT_CACHE_LENGTH);
  + if (typeof(eventContent.content.body) !== "string") {
  + throw Error("'body' was not a string.");
  + }
  + const isReply = event.content["m.relates_to"] && event.content["m.relates_to"]["m.in_reply_to"];
  + if (isReply) {
  + let match = REPLY_REGEX.exec(event.content.body);
  + rplSource = match.length === 4 ? match[3] : event.content.body;
  + }
  + else {
  + rplSource = eventContent.content.body;
  + }
  + rplSource = eventContent.content.body.substr(0, REPLY_SOURCE_MAX_LENGTH);
  this._eventCache.set(eventId, {sender: rplName, body: rplSource});
  } catch (err) {
  // If we couldn't find the event, then frankly we can't trust it and we won't treat it as a reply.
  