@@ -395,6 +395,87 @@ def from_dict(cls, data: dict[str, Any]) -> "FormContent":
395395 )
396396
397397
398+ class SMSContent (TicketContent ):
399+ """Content from SMS messages."""
400+
401+ def __init__ (
402+ self ,
403+ sender_phone_number : str ,
404+ message_body : str ,
405+ timestamp : datetime ,
406+ message_sid : Optional [str ] = None ,
407+ ):
408+ self ._sender_phone_number = sender_phone_number
409+ self ._recipient_phone_number = recipient_phone_number
410+ self ._message_body = message_body
411+ self ._timestamp = timestamp
412+ self ._message_sid = message_sid
413+
414+ @property
415+ def raw_content (self ) -> str :
416+ return self ._message_body
417+
418+ @property
419+ def sender (self ) -> str :
420+ return self ._sender_phone_number
421+
422+ @property
423+ def timestamp (self ) -> datetime :
424+ return self ._timestamp
425+
426+ @property
427+ def metadata (self ) -> dict [str , Any ]:
428+ return {
429+ "recipient_phone_number" : self ._recipient_phone_number ,
430+ "message_sid" : self ._message_sid ,
431+ }
432+
433+ @property
434+ def sender_phone_number (self ) -> str :
435+ return self ._sender_phone_number
436+
437+ @property
438+ def recipient_phone_number (self ) -> str :
439+ return self ._recipient_phone_number
440+
441+ @property
442+ def message_body (self ) -> str :
443+ return self ._message_body
444+
445+ @property
446+ def message_sid (self ) -> Optional [str ]:
447+ return self ._message_sid
448+
449+ def extract_body (self ) -> str :
450+ return self ._message_body
451+
452+ def extract_attachments (self ) -> list [dict [str , Any ]]:
453+ return []
454+
455+ def to_dict (self ) -> dict [str , Any ]:
456+ return {
457+ "type" : "sms" ,
458+ "sender_phone_number" : self ._sender_phone_number ,
459+ "recipient_phone_number" : self ._recipient_phone_number ,
460+ "message_body" : self ._message_body ,
461+ "timestamp" : self ._timestamp .isoformat (),
462+ "message_sid" : self ._message_sid ,
463+ }
464+
465+ @classmethod
466+ def from_dict (cls , data : dict [str , Any ]) -> "SMSContent" :
467+ timestamp = data .get ("timestamp" )
468+ if isinstance (timestamp , str ):
469+ timestamp = datetime .fromisoformat (timestamp .replace ("Z" , "+00:00" ))
470+ return cls (
471+ sender_phone_number = data ["sender_phone_number" ],
472+ recipient_phone_number = data ["recipient_phone_number" ],
473+ message_body = data ["message_body" ],
474+ timestamp = timestamp ,
475+ message_sid = data .get ("message_sid" ),
476+ )
477+
478+
398479def content_from_dict (data : dict [str , Any ]) -> TicketContent :
399480 """Factory function to create the appropriate content type from a dictionary."""
400481 content_type = data .get ("type" , "" ).lower ()
@@ -407,5 +488,7 @@ def content_from_dict(data: dict[str, Any]) -> TicketContent:
407488 return GitHubContent .from_dict (data )
408489 elif content_type == "form" :
409490 return FormContent .from_dict (data )
491+ elif content_type == "sms" :
492+ return SMSContent .from_dict (data )
410493 else :
411494 raise ValueError (f"Unknown content type: { content_type } " )
0 commit comments