onMessage method
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;
}
}
}
});