mirror of
				https://github.com/MCV-Software/TWBlue.git
				synced 2025-11-03 21:37:05 +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