def narrow_filter(event: Mapping[str, Any]) -> bool: message = event["message"] flags = event["flags"] for element in narrow: operator = element[0] operand = element[1] if operator == "stream": if message["type"] != "stream": return False if operand.lower() != message["display_recipient"].lower(): return False elif operator == "topic": if message["type"] != "stream": return False topic_name = get_topic_from_message_info(message) if operand.lower() != topic_name.lower(): return False elif operator == "sender": if operand.lower() != message["sender_email"].lower(): return False elif operator == "is" and operand == "private": if message["type"] != "private": return False elif operator == "is" and operand in ["starred"]: if operand not in flags: return False elif operator == "is" and operand == "unread": if "read" in flags: return False elif operator == "is" and operand in ["alerted", "mentioned"]: if "mentioned" not in flags: return False return True
def narrow_filter(event: Mapping[str, Any]) -> bool: message = event["message"] flags = event["flags"] for element in narrow: operator = element[0] operand = element[1] if operator == "stream": if message["type"] != "stream": return False if operand.lower() != message["display_recipient"].lower(): return False elif operator == "topic": if message["type"] != "stream": return False topic_name = get_topic_from_message_info(message) if operand.lower() != topic_name.lower(): return False elif operator == "sender": if operand.lower() != message["sender_email"].lower(): return False elif operator == "is" and operand == "private": if message["type"] != "private": return False elif operator == "is" and operand in ["starred"]: if operand not in flags: return False elif operator == "is" and operand == "unread": if "read" in flags: return False elif operator == "is" and operand in ["alerted", "mentioned"]: if "mentioned" not in flags: return False return True
def send_response_message( bot_id: int, message_info: Dict[str, Any], response_data: Dict[str, Any] ) -> None: """ bot_id is the user_id of the bot sending the response message_info is used to address the message and should have these fields: type - "stream" or "private" display_recipient - like we have in other message events topic - see get_topic_from_message_info response_data is what the bot wants to send back and has these fields: content - raw Markdown content for Zulip to render WARNING: This function sends messages bypassing the stream access check for the bot - so use with caution to not call this in codepaths that might let someone send arbitrary messages to any stream through this. """ message_type = message_info["type"] display_recipient = message_info["display_recipient"] try: topic_name: Optional[str] = get_topic_from_message_info(message_info) except KeyError: topic_name = None bot_user = get_user_profile_by_id(bot_id) realm = bot_user.realm client = get_client("OutgoingWebhookResponse") content = response_data.get("content") assert content widget_content = response_data.get("widget_content") if message_type == "stream": message_to = [display_recipient] elif message_type == "private": message_to = [recipient["email"] for recipient in display_recipient] else: raise JsonableError(_("Invalid message type")) check_send_message( sender=bot_user, client=client, message_type_name=message_type, message_to=message_to, topic_name=topic_name, message_content=content, widget_content=widget_content, realm=realm, skip_stream_access_check=True, )
def send_response_message(bot_id: str, message_info: Dict[str, Any], response_data: Dict[str, Any]) -> None: """ bot_id is the user_id of the bot sending the response message_info is used to address the message and should have these fields: type - "stream" or "private" display_recipient - like we have in other message events topic - see get_topic_from_message_info response_data is what the bot wants to send back and has these fields: content - raw markdown content for Zulip to render """ message_type = message_info['type'] display_recipient = message_info['display_recipient'] try: topic_name = get_topic_from_message_info(message_info) except KeyError: topic_name = None bot_user = get_user_profile_by_id(bot_id) realm = bot_user.realm client = get_client('OutgoingWebhookResponse') content = response_data.get('content') if not content: raise JsonableError(_("Missing content")) widget_content = response_data.get('widget_content') if message_type == 'stream': message_to = [display_recipient] elif message_type == 'private': message_to = [recipient['email'] for recipient in display_recipient] else: raise JsonableError(_("Invalid message type")) check_send_message( sender=bot_user, client=client, message_type_name=message_type, message_to=message_to, topic_name=topic_name, message_content=content, widget_content=widget_content, realm=realm, )
def send_reply(self, message: Dict[str, Any], response: str) -> None: if message['type'] == 'private': self.send_message(dict( type='private', to=[x['email'] for x in message['display_recipient']], content=response, sender_email=message['sender_email'], )) else: self.send_message(dict( type='stream', to=message['display_recipient'], topic=get_topic_from_message_info(message), content=response, sender_email=message['sender_email'], ))
def send_reply(self, message: Dict[str, Any], response: str) -> None: if message['type'] == 'private': self.send_message(dict( type='private', to=[x['email'] for x in message['display_recipient']], content=response, sender_email=message['sender_email'], )) else: self.send_message(dict( type='stream', to=message['display_recipient'], topic=get_topic_from_message_info(message), content=response, sender_email=message['sender_email'], ))
def send_response_message(bot_id: str, message_info: Dict[str, Any], response_data: Dict[str, Any]) -> None: """ bot_id is the user_id of the bot sending the response message_info is used to address the message and should have these fields: type - "stream" or "private" display_recipient - like we have in other message events topic - see get_topic_from_message_info response_data is what the bot wants to send back and has these fields: content - raw markdown content for Zulip to render """ message_type = message_info['type'] display_recipient = message_info['display_recipient'] try: topic_name = get_topic_from_message_info(message_info) except KeyError: topic_name = None bot_user = get_user_profile_by_id(bot_id) realm = bot_user.realm client = get_client('OutgoingWebhookResponse') content = response_data.get('content') if not content: raise JsonableError(_("Missing content")) widget_content = response_data.get('widget_content') if message_type == 'stream': message_to = [display_recipient] elif message_type == 'private': message_to = [recipient['email'] for recipient in display_recipient] else: raise JsonableError(_("Invalid message type")) check_send_message( sender=bot_user, client=client, message_type_name=message_type, message_to=message_to, topic_name=topic_name, message_content=content, widget_content=widget_content, realm=realm, )
def send_reply(self, message: Dict[str, Any], response: str) -> None: if message["type"] == "private": self.send_message( dict( type="private", to=[x["email"] for x in message["display_recipient"]], content=response, sender_email=message["sender_email"], )) else: self.send_message( dict( type="stream", to=message["display_recipient"], topic=get_topic_from_message_info(message), content=response, sender_email=message["sender_email"], ))
def near_stream_message_url(realm: Realm, message: Dict[str, Any]) -> str: message_id = str(message["id"]) stream_id = message["stream_id"] stream_name = message["display_recipient"] topic_name = get_topic_from_message_info(message) encoded_topic = hash_util_encode(topic_name) encoded_stream = encode_stream(stream_id=stream_id, stream_name=stream_name) parts = [ realm.uri, "#narrow", "stream", encoded_stream, "topic", encoded_topic, "near", message_id, ] full_url = "/".join(parts) return full_url
def near_stream_message_url(realm: Realm, message: Dict[str, Any]) -> str: message_id = str(message['id']) stream_id = message['stream_id'] stream_name = message['display_recipient'] topic_name = get_topic_from_message_info(message) encoded_topic = hash_util_encode(topic_name) encoded_stream = encode_stream(stream_id=stream_id, stream_name=stream_name) parts = [ realm.uri, '#narrow', 'stream', encoded_stream, 'topic', encoded_topic, 'near', message_id, ] full_url = '/'.join(parts) return full_url
def near_stream_message_url(realm: Realm, message: Dict[str, Any]) -> str: message_id = str(message['id']) stream_id = message['stream_id'] stream_name = message['display_recipient'] topic_name = get_topic_from_message_info(message) encoded_topic = hash_util_encode(topic_name) encoded_stream = encode_stream(stream_id=stream_id, stream_name=stream_name) parts = [ realm.uri, '#narrow', 'stream', encoded_stream, 'topic', encoded_topic, 'near', message_id, ] full_url = '/'.join(parts) return full_url
def send_reply(self, message: Dict[str, Any], response: str, widget_content: Optional[str] = None) -> Dict[str, Any]: if message["type"] == "private": result = self.send_message( dict( type="private", to=[x["email"] for x in message["display_recipient"]], content=response, sender_email=message["sender_email"], )) else: result = self.send_message( dict( type="stream", to=message["display_recipient"], topic=get_topic_from_message_info(message), content=response, sender_email=message["sender_email"], )) return {"id": result["id"]}