onMessage method

Stream<Message> onMessage({
  1. String? entityType,
  2. dynamic keyword,
})

Listens to message events

For the documentation, check TeleDart.onMessage.

Implementation

Stream<Message> onMessage({String? entityType, dynamic keyword}) =>
    _messageStreamController.stream.where((message) {
      if (keyword == null) {
        if (entityType == null) {
          // no keyword and entityType
          return (message.entities ?? message.captionEntities) == null;
        } else {
          // no keyword but entityType
          return entityType == '*' || message.entityOf(entityType) != null;
        }
      } else {
        if (keyword is! String && keyword is! RegExp) {
          throw TeleDartEventException(
              'Attribute \'keyword\' accepts type of String or RegExp');
        } else if (entityType == null) {
          return (message.entities ?? message.captionEntities) == null &&
              (message.text ?? message.caption ?? '').contains(keyword);
        } else if (message.entityOf(entityType) == null) {
          return false;
        } else if (entityType == MessageEntity.typeTextMention) {
          var userId = message.entityOf(entityType)?.user?.id;
          var firstName = message.entityOf(entityType)?.user?.firstName;
          if (keyword is RegExp) {
            var matchFirstName =
                firstName != null ? keyword.hasMatch(firstName) : false;
            var matchUserId =
                userId != null ? keyword.hasMatch(userId.toString()) : false;
            return matchFirstName || matchUserId;
          } else {
            return keyword == firstName || keyword == userId;
          }
        } else {
          var entityText = '';

          switch (entityType) {
            case '*': // Any entityType
              entityText = (message.text ?? message.caption ?? '');
              break;
            case MessageEntity.typeMention: // '\@${keyword}'
            case MessageEntity.typeCashtag: // '\$${keyword}'
            case MessageEntity.typeHashtag: // '\#${keyword}'
              entityText = message.getEntity(entityType)?.substring(1) ?? '';
              break;
            case MessageEntity
                  .typeBotCommand: // '\/${keyword}' or '\/${keyword}\@${me.username}'
              entityText = message
                      .getEntity(entityType)
                      ?.substring(1)
                      .replaceAll('@$username', '') ??
                  '';
              break;
            case MessageEntity.typeUrl:
            case MessageEntity.typeEmail:
            case MessageEntity.typePhoneNmber:
            case MessageEntity.typeItalic:
            case MessageEntity.typeSpolier:
            case MessageEntity.typeCode:
            case MessageEntity
                  .typePre: // TODO: need to return language prop somehow
            case MessageEntity.typeUnderline:
            case MessageEntity.typeStrikethrough:
              entityText = message.getEntity(entityType) ?? '';
              break;
            case MessageEntity.typeTextLink:
              entityText = message.entityOf(entityType)?.url ?? '';
              break;
            case MessageEntity.typeCustomEmoji:
              entityText = message.entityOf(entityType)?.customEmojiId ?? '';
              break;
            default: // Dynamically listen to message types.
              entityText = message.getEntity(entityType) ?? '';
              break;
          }

          if (keyword is RegExp) {
            return keyword.hasMatch(entityText);
          } else {
            return keyword == entityText;
          }
        }
      }
    });