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: