mirror of
				https://github.com/MCV-Software/TWBlue.git
				synced 2025-10-30 20:02:01 +00:00 
			
		
		
		
	Added Mastodon authorisation and authentication methods in a session. Added get_user_info, get_lists, get_muted_users
This commit is contained in:
		
							
								
								
									
										88
									
								
								src/sessions/mastodon/session.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/sessions/mastodon/session.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | import os | ||||||
|  | import paths | ||||||
|  | import time | ||||||
|  | import logging | ||||||
|  | import wx | ||||||
|  | import config | ||||||
|  | import config_utils | ||||||
|  | import output | ||||||
|  | import application | ||||||
|  | from pubsub import pub | ||||||
|  | import mastodon | ||||||
|  | from mysc.thread_utils import call_threaded | ||||||
|  | from sessions import base | ||||||
|  | from .wxUI import authorisationDialog | ||||||
|  |  | ||||||
|  | log = logging.getLogger("sessions.mastodonSession") | ||||||
|  |  | ||||||
|  | class Session(base.baseSession): | ||||||
|  |  | ||||||
|  |     def __init__(self, *args, **kwargs): | ||||||
|  |         super(Session, self).__init__(*args, **kwargs) | ||||||
|  |         self.config_spec = "mastodon.defaults" | ||||||
|  |         self.supported_languages = [] | ||||||
|  |  | ||||||
|  |     def login(self, verify_credentials=True): | ||||||
|  |         if self.settings["mastodon"]["access_token"] != None and self.settings["mastodon"]["instance"] != None: | ||||||
|  |             try: | ||||||
|  |                 log.debug("Logging in to Mastodon instance {}...".format(self.settings["mastodon"]["instance"])) | ||||||
|  |                 self.api = mastodon.Mastodon(access_token=self.settings["mastodon"]["access_token"], api_base_url=self.settings["mastodon"]["instance"]) | ||||||
|  |                 if verify_credentials == True: | ||||||
|  |                     credentials = self.api.account_verify_credentials() | ||||||
|  |                     self.db["user_name"] = credentials["username"] | ||||||
|  |                     self.db["user_id"] = credentials["id"] | ||||||
|  |                     self.settings["mastodon"]["user_name"] = credentials["username"] | ||||||
|  |                 self.logged = True | ||||||
|  |                 log.debug("Logged.") | ||||||
|  |                 self.counter = 0 | ||||||
|  |             except IOError: | ||||||
|  |                 log.error("The login attempt failed.") | ||||||
|  |                 self.logged = False | ||||||
|  |         else: | ||||||
|  |             self.logged = False | ||||||
|  |             raise Exceptions.RequireCredentialsSessionError | ||||||
|  |  | ||||||
|  |     def authorise(self): | ||||||
|  |         if self.logged == True: | ||||||
|  |             raise Exceptions.AlreadyAuthorisedError("The authorisation process is not needed at this time.") | ||||||
|  |         else: | ||||||
|  |             self.authorisation_dialog = authorisationDialog() | ||||||
|  |             answer = self.authorisation_dialog.ShowModal() | ||||||
|  |             if answer == wx.ID_OK: | ||||||
|  |                 client_id, client_secret = mastodon.Mastodon.create_app("TWBlue", api_base_url=self.authorisation_dialog.instance.GetValue(), website="https://twblue.es") | ||||||
|  |                 temporary_api = mastodon.Mastodon(client_id=client_id, client_secret=client_secret, api_base_url=self.authorisation_dialog.instance.GetValue()) | ||||||
|  |                 access_token = temporary_api.log_in(self.authorisation_dialog.email.GetValue(), self.authorisation_dialog.password.GetValue()) | ||||||
|  |                 self.settings["mastodon"]["access_token"] = access_token | ||||||
|  |                 self.settings["mastodon"]["instance"] = self.authorisation_dialog.instance.GetValue() | ||||||
|  |                 self.settings.write() | ||||||
|  |  | ||||||
|  |     def get_user_info(self): | ||||||
|  |         """ Retrieves some information required by TWBlue for setup.""" | ||||||
|  |         # retrieve the current user's UTC offset so we can calculate dates properly. | ||||||
|  |         offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone | ||||||
|  |         offset = offset / 60 / 60 * -1 | ||||||
|  |         self.db["utc_offset"] = offset | ||||||
|  |         if len(self.supported_languages) == 0: | ||||||
|  |             self.supported_languages = self.api.instance().languages | ||||||
|  |         self.get_lists() | ||||||
|  |         self.get_muted_users() | ||||||
|  |         self.settings.write() | ||||||
|  |  | ||||||
|  |     def get_lists(self): | ||||||
|  |         """ Gets the lists that the user is subscribed to and stores them in the database. Returns None.""" | ||||||
|  |         self.db["lists"] = self.api.lists() | ||||||
|  |  | ||||||
|  |     def get_muted_users(self): | ||||||
|  |         ### ToDo: Use a function to retrieve all muted users. | ||||||
|  |         self.db["muted_users"] = self.api.mutes() | ||||||
|  |  | ||||||
|  |     def get_user_alias(self, user): | ||||||
|  |         aliases = self.settings.get("user-aliases") | ||||||
|  |         if aliases == None: | ||||||
|  |             log.error("Aliases are not defined for this config spec.") | ||||||
|  |             return user.name | ||||||
|  |         user_alias = aliases.get(user.id_str) | ||||||
|  |         if user_alias != None: | ||||||
|  |             return user_alias | ||||||
|  |         return user.name | ||||||
							
								
								
									
										35
									
								
								src/sessions/mastodon/wxUI.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/sessions/mastodon/wxUI.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | import wx | ||||||
|  |  | ||||||
|  | class authorisationDialog(wx.Dialog): | ||||||
|  |     def __init__(self): | ||||||
|  |         super(authorisationDialog, self).__init__(parent=None, title=_(u"Authorising account...")) | ||||||
|  |         panel = wx.Panel(self) | ||||||
|  |         sizer = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         static1 = wx.StaticText(panel, wx.NewId(), _("URL of mastodon instance:")) | ||||||
|  |         self.instance = wx.TextCtrl(panel, -1) | ||||||
|  |         sizer1 = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         sizer1.Add(static1, 0, wx.ALL, 5) | ||||||
|  |         sizer1.Add(self.instance, 0, wx.ALL, 5) | ||||||
|  |         sizer.Add(sizer1, 0, wx.ALL, 5) | ||||||
|  |         static2 = wx.StaticText(panel, wx.NewId(), _("Email address:")) | ||||||
|  |         self.email = wx.TextCtrl(panel, -1) | ||||||
|  |         sizer2 = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         sizer2.Add(static2, 0, wx.ALL, 5) | ||||||
|  |         sizer2.Add(self.email, 0, wx.ALL, 5) | ||||||
|  |         sizer.Add(sizer2, 0, wx.ALL, 5) | ||||||
|  |         static3 = wx.StaticText(panel, wx.NewId(), _("Password:")) | ||||||
|  |         self.password = wx.TextCtrl(panel, -1) | ||||||
|  |         sizer3 = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         sizer3.Add(static3, 0, wx.ALL, 5) | ||||||
|  |         sizer3.Add(self.password, 0, wx.ALL, 5) | ||||||
|  |         sizer.Add(sizer3, 0, wx.ALL, 5) | ||||||
|  |         self.ok = wx.Button(panel, wx.ID_OK) | ||||||
|  |         self.cancel = wx.Button(panel, wx.ID_CANCEL) | ||||||
|  |         sizer4 = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         sizer4.Add(self.ok, 0, wx.ALL, 5) | ||||||
|  |         sizer4.Add(self.cancel, 0, wx.ALL, 5) | ||||||
|  |         sizer.Add(sizer4, 0, wx.ALL, 5) | ||||||
|  |         panel.SetSizer(sizer) | ||||||
|  |         min = sizer.CalcMin() | ||||||
|  |         self.SetClientSize(min) | ||||||
		Reference in New Issue
	
	Block a user