mirror of
https://github.com/nikdoof/smsbot.git
synced 2025-12-17 11:49:28 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
1872a97088
|
|||
|
51d37a3e61
|
|||
|
8ff16ba9d3
|
2
.github/workflows/release.yaml
vendored
2
.github/workflows/release.yaml
vendored
@@ -2,8 +2,6 @@ name: Release
|
|||||||
|
|
||||||
"on":
|
"on":
|
||||||
push:
|
push:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "smsbot"
|
name = "smsbot"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
description = "A simple Telegram bot to receive SMS messages."
|
description = "A simple Telegram bot to receive SMS messages."
|
||||||
authors = [{ name = "Andrew Williams", email = "andy@tensixtyone.com" }]
|
authors = [{ name = "Andrew Williams", email = "andy@tensixtyone.com" }]
|
||||||
license = { text = "MIT" }
|
license = { text = "MIT" }
|
||||||
|
|||||||
@@ -5,19 +5,14 @@ def get_smsbot_version():
|
|||||||
return version("smsbot")
|
return version("smsbot")
|
||||||
|
|
||||||
|
|
||||||
class TwilioMessage:
|
class TwilioWebhookPayload:
|
||||||
"""
|
@staticmethod
|
||||||
Parses a Twilio webhook message.
|
def parse(data: dict):
|
||||||
"""
|
"""Return the correct class for the incoming Twilio webhook payload"""
|
||||||
|
if "SmsMessageSid" in data:
|
||||||
def __init__(self, data: dict) -> None:
|
return TwilioMessage(data)
|
||||||
self.from_number: str = data.get("From", "Unknown")
|
if "CallSid" in data:
|
||||||
self.to_number: str = data.get("To", "Unknown")
|
return TwilioCall(data)
|
||||||
self.body: str = data.get("Body", "")
|
|
||||||
|
|
||||||
self.media = []
|
|
||||||
for i in range(0, int(data.get("NumMedia", "0"))):
|
|
||||||
self.media.append(data.get(f"MediaUrl{i}"))
|
|
||||||
|
|
||||||
def _escape(self, text: str) -> str:
|
def _escape(self, text: str) -> str:
|
||||||
"""Escape text for MarkdownV2"""
|
"""Escape text for MarkdownV2"""
|
||||||
@@ -45,6 +40,19 @@ class TwilioMessage:
|
|||||||
text = text.replace(char, rf"\{char}")
|
text = text.replace(char, rf"\{char}")
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
class TwilioMessage(TwilioWebhookPayload):
|
||||||
|
"""Represents a Twilio SMS message"""
|
||||||
|
|
||||||
|
def __init__(self, data: dict) -> None:
|
||||||
|
self.from_number: str = data.get("From", "Unknown")
|
||||||
|
self.to_number: str = data.get("To", "Unknown")
|
||||||
|
self.body: str = data.get("Body", "")
|
||||||
|
|
||||||
|
self.media = []
|
||||||
|
for i in range(0, int(data.get("NumMedia", "0"))):
|
||||||
|
self.media.append(data.get(f"MediaUrl{i}"))
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"TwilioWebhookMessage(from={self.from_number}, to={self.to_number})"
|
return f"TwilioWebhookMessage(from={self.from_number}, to={self.to_number})"
|
||||||
|
|
||||||
@@ -54,6 +62,29 @@ class TwilioMessage:
|
|||||||
return msg
|
return msg
|
||||||
|
|
||||||
def to_markdownv2(self):
|
def to_markdownv2(self):
|
||||||
media_str = "\n".join([f"{self._escape(url)}" for url in self.media]) if self.media else ""
|
media_str = (
|
||||||
|
"\n".join([f"{self._escape(url)}" for url in self.media])
|
||||||
|
if self.media
|
||||||
|
else ""
|
||||||
|
)
|
||||||
msg = f"**From**: {self._escape(self.from_number)}\n**To**: {self._escape(self.to_number)}\n\n{self._escape(self.body)}\n\n{media_str}"
|
msg = f"**From**: {self._escape(self.from_number)}\n**To**: {self._escape(self.to_number)}\n\n{self._escape(self.body)}\n\n{media_str}"
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
class TwilioCall(TwilioWebhookPayload):
|
||||||
|
"""Represents a Twilio voice call"""
|
||||||
|
|
||||||
|
def __init__(self, data: dict) -> None:
|
||||||
|
self.from_number: str = data.get("From", "Unknown")
|
||||||
|
self.to_number: str = data.get("To", "Unknown")
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"TwilioCall(from={self.from_number}, to={self.to_number})"
|
||||||
|
|
||||||
|
def to_str(self) -> str:
|
||||||
|
msg = f"Call from {self.from_number}, rejected."
|
||||||
|
return msg
|
||||||
|
|
||||||
|
def to_markdownv2(self):
|
||||||
|
msg = f"Call from {self._escape(self.from_number)}, rejected\."
|
||||||
|
return msg
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from prometheus_client import Counter, Summary, make_wsgi_app
|
|||||||
from twilio.request_validator import RequestValidator
|
from twilio.request_validator import RequestValidator
|
||||||
from werkzeug.middleware.dispatcher import DispatcherMiddleware
|
from werkzeug.middleware.dispatcher import DispatcherMiddleware
|
||||||
|
|
||||||
from smsbot.utils import TwilioMessage, get_smsbot_version
|
from smsbot.utils import TwilioWebhookPayload, get_smsbot_version
|
||||||
|
|
||||||
REQUEST_TIME = Summary(
|
REQUEST_TIME = Summary(
|
||||||
"webhook_request_processing_seconds", "Time spent processing request"
|
"webhook_request_processing_seconds", "Time spent processing request"
|
||||||
@@ -88,7 +88,7 @@ class TwilioWebhookHandler(object):
|
|||||||
)
|
)
|
||||||
|
|
||||||
await self.bot.send_subscribers(
|
await self.bot.send_subscribers(
|
||||||
TwilioMessage(request.values.to_dict()).to_markdownv2()
|
TwilioWebhookPayload.parse(request.values.to_dict()).to_markdownv2()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Return a blank response
|
# Return a blank response
|
||||||
@@ -103,7 +103,7 @@ class TwilioWebhookHandler(object):
|
|||||||
"Received Call from {From}".format(**request.values.to_dict())
|
"Received Call from {From}".format(**request.values.to_dict())
|
||||||
)
|
)
|
||||||
await self.bot.send_subscribers(
|
await self.bot.send_subscribers(
|
||||||
"Received Call from {From}, rejecting.".format(**request.values.to_dict())
|
TwilioWebhookPayload.parse(request.values.to_dict()).to_markdownv2()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Always reject calls
|
# Always reject calls
|
||||||
|
|||||||
2
uv.lock
generated
2
uv.lock
generated
@@ -567,7 +567,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smsbot"
|
name = "smsbot"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
source = { editable = "." }
|
source = { editable = "." }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "flask", extra = ["async"] },
|
{ name = "flask", extra = ["async"] },
|
||||||
|
|||||||
Reference in New Issue
Block a user