diff --git a/github/data_types/category.py b/github/data_types/category.py new file mode 100644 index 0000000..5dfa141 --- /dev/null +++ b/github/data_types/category.py @@ -0,0 +1,20 @@ +class Category: + """ + Category + + Attributes: + name: Category name + description: Category description + created_at: Opening time + """ + + def __init__(self, data): + + # Category name + self.name = data.get('name', '') + + # Description + self.description = data.get('description', '') + + # Created date + self.created_at = data.get('created_at', '') diff --git a/github/data_types/discussion.py b/github/data_types/discussion.py new file mode 100644 index 0000000..1df4bb7 --- /dev/null +++ b/github/data_types/discussion.py @@ -0,0 +1,36 @@ +from data_types.user import User +from data_types.category import Category + +class Discussion: + """ + GitHub Discussions + + Attributes: + id: Discussion id + title: Discussion title + html_url: Public URL for discussion on github.com + number: Discussion's number in repository + user: Discussion creator User object + """ + + def __init__(self, data): + + # Internal GitHub id + self.id = data.get('id', 0) + + # Title + self.title = data.get('title', '') + + # Public link + self.html_url = data.get('html_url', '') + + # Number in repository + self.number = data.get('number', '') + + # Category + self.category = Category(data['category']) + + # Who created + self.user = None + if 'user' in data: + self.user = User(data['user']) \ No newline at end of file diff --git a/github/events/discussions.py b/github/events/discussions.py new file mode 100644 index 0000000..f35265a --- /dev/null +++ b/github/events/discussions.py @@ -0,0 +1,102 @@ +import html + +from data_types.discussion import Discussion +from data_types.repository import Repository +from data_types.user import User +from .base import EventBase + + +class EventDiscussions(EventBase): + + def __init__(self, sdk): + super(EventDiscussions, self).__init__(sdk) + self.discussion = None + self.repository = None + self.sender = None + self.sdk = sdk + + """ + DiscussionsEvent + + Triggered when an discussion is created. + + https://developer.github.com/v3/activity/events/types/#discussionevent + """ + + async def process(self, payload, chat): + """ + Processes Discussions event + :param payload: JSON object with payload + :param chat: current chat object + :return: + """ + + self.sdk.log("Discussions event payload taken") + + try: + self.discussion = Discussion(payload['discussion']) + self.repository = Repository(payload['repository']) + self.sender = User(payload['sender']) + + except Exception as e: + self.sdk.log('Cannot process DiscussionsEvent payload because of {}'.format(e)) + + action = payload['action'] + + available_actions = { + 'created': self.created, + 'deleted': self.deleted, + } + + if action not in available_actions: + self.sdk.log('Unsupported Discussions action: {}'.format(action)) + return + + # call action handler + await available_actions[action](chat['chat'], payload) + + async def created(self, chat_id, payload): + """ + Discussion Created action + :param chat_id: Current user chat token + :param payload: GitHub payload + :return: + """ + + message = "🗣{}: {} created new discussion «{}» [{}]".format( + self.discussion.category.name, + self.sender.login, + html.escape(self.discussion.title), + self.repository.html_url, + self.repository.name + ) + "\n\n" + + message += self.discussion.html_url + + await self.send( + chat_id, + message, + 'HTML' + ) + + async def deleted(self, chat_id, payload): + """ + Discussion deleted action + :param chat_id: Current user chat token + :param payload: GitHub payload + :return: + """ + + message = "🤭️ {} deleted discussion «{}» [{}]".format( + self.sender.login, + html.escape(self.discussion.title), + self.repository.html_url, + self.repository.name + ) + "\n\n" + + await self.send( + chat_id, + message, + 'HTML' + ) + diff --git a/github/events/issues.py b/github/events/issues.py index f1b35a9..e16daf5 100644 --- a/github/events/issues.py +++ b/github/events/issues.py @@ -66,11 +66,11 @@ async def opened(self, chat_id, payload): """ message = "✏️ {} opened new issue «{}» [{}]".format( - self.sender.login, - html.escape(self.issue.title), - self.repository.html_url, - self.repository.name - ) + "\n\n" + self.sender.login, + html.escape(self.issue.title), + self.repository.html_url, + self.repository.name + ) + "\n\n" # if len(self.issue.body): # message += html.escape(self.issue.body) + "\n\n" @@ -119,12 +119,13 @@ async def assigned(self, chat_id, payload): assignee = User(payload['assignee']) message = "📌 {assignee} has been assigned to the issue «{issue_title}» " \ - "by {author} [{repository_name}]".format( - assignee=assignee.login, - author=self.sender.login, - issue_title=html.escape(self.issue.title), - repository_name=self.repository.name - ) + "\n\n" + "by {author} [{repository_name}]".format( + assignee=assignee.login, + author=self.sender.login, + issue_title=html.escape(self.issue.title), + repository_html=self.repository.html_url, + repository_name=self.repository.name + ) + "\n\n" message += self.issue.html_url diff --git a/github/main.py b/github/main.py index 58a67c8..f71873e 100644 --- a/github/main.py +++ b/github/main.py @@ -14,6 +14,7 @@ from events.ping import EventPing from events.push import EventPush from events.issues import EventIssues +from events.discussions import EventDiscussions from events.issue_comment import EventIssueComment from events.pull_request import EventPullRequest from events.pull_request_review import EventPullRequestReview @@ -80,7 +81,8 @@ async def github_callback_handler(self, request): 'issue_comment': EventIssueComment(self.sdk), 'pull_request': EventPullRequest(self.sdk), 'pull_request_review': EventPullRequestReview(self.sdk), - 'repository': EventRepository(self.sdk) + 'repository': EventRepository(self.sdk), + 'discussion': EventDiscussions(self.sdk) } if event_name not in events: