mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			Check for moved actors on daemon start
							parent
							
								
									0243c5579e
								
							
						
					
					
						commit
						8eeae6968b
					
				| 
						 | 
				
			
			@ -416,6 +416,7 @@ from qrcode import save_domain_qrcode
 | 
			
		|||
from importFollowing import run_import_following_watchdog
 | 
			
		||||
from maps import map_format_from_tagmaps_path
 | 
			
		||||
from relationships import get_moved_feed
 | 
			
		||||
from relationships import update_moved_actors
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -22077,6 +22078,8 @@ def run_daemon(max_hashtags: int,
 | 
			
		|||
            print('Invalid domain: ' + domain)
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
    update_moved_actors(base_dir, debug)
 | 
			
		||||
 | 
			
		||||
    if unit_test:
 | 
			
		||||
        server_address = (domain, proxy_port)
 | 
			
		||||
        pub_handler = partial(PubServerUnitTest)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										112
									
								
								relationships.py
								
								
								
								
							
							
						
						
									
										112
									
								
								relationships.py
								
								
								
								
							| 
						 | 
				
			
			@ -14,23 +14,27 @@ from utils import get_full_domain
 | 
			
		|||
from utils import local_actor_url
 | 
			
		||||
from utils import remove_domain_port
 | 
			
		||||
from utils import remove_eol
 | 
			
		||||
from utils import is_account_dir
 | 
			
		||||
from utils import get_nickname_from_actor
 | 
			
		||||
from utils import get_domain_from_actor
 | 
			
		||||
from utils import load_json
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_moved_accounts(base_dir: str, nickname: str, domain: str,
 | 
			
		||||
                       filename: str = 'following.txt') -> {}:
 | 
			
		||||
    """returns a dict of moved accounts
 | 
			
		||||
    """
 | 
			
		||||
    refollow_filename = base_dir + '/accounts/actors_moved.txt'
 | 
			
		||||
    if not os.path.isfile(refollow_filename):
 | 
			
		||||
    moved_accounts_filename = base_dir + '/accounts/actors_moved.txt'
 | 
			
		||||
    if not os.path.isfile(moved_accounts_filename):
 | 
			
		||||
        return {}
 | 
			
		||||
    refollow_str = ''
 | 
			
		||||
    try:
 | 
			
		||||
        with open(refollow_filename, 'r',
 | 
			
		||||
        with open(moved_accounts_filename, 'r',
 | 
			
		||||
                  encoding='utf-8') as fp_refollow:
 | 
			
		||||
            refollow_str = fp_refollow.read()
 | 
			
		||||
    except OSError:
 | 
			
		||||
        print('EX: get_moved_accounts unable to read ' +
 | 
			
		||||
              refollow_filename)
 | 
			
		||||
              moved_accounts_filename)
 | 
			
		||||
    refollow_list = refollow_str.split('\n')
 | 
			
		||||
    refollow_dict = {}
 | 
			
		||||
    for line in refollow_list:
 | 
			
		||||
| 
						 | 
				
			
			@ -175,3 +179,103 @@ def get_moved_feed(base_dir: str, domain: str, port: int, path: str,
 | 
			
		|||
            local_actor_url(http_prefix, nickname, domain) + \
 | 
			
		||||
            '/moved?page=' + str(last_page)
 | 
			
		||||
    return following
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def update_moved_actors(base_dir: str, debug: bool) -> None:
 | 
			
		||||
    """Updates the file containing moved actors
 | 
			
		||||
    """
 | 
			
		||||
    actors_cache_dir = base_dir + '/cache/actors'
 | 
			
		||||
    if not os.path.isdir(actors_cache_dir):
 | 
			
		||||
        if debug:
 | 
			
		||||
            print('No cached actors')
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    if debug:
 | 
			
		||||
        print('Updating moved actors')
 | 
			
		||||
    actors_dict = {}
 | 
			
		||||
    for _, _, files in os.walk(actors_cache_dir):
 | 
			
		||||
        for actor_str in files:
 | 
			
		||||
            if not actor_str.endswith('.json'):
 | 
			
		||||
                continue
 | 
			
		||||
            orig_str = actor_str
 | 
			
		||||
            actor_str = actor_str.replace('.json', '').replace('#', '/')
 | 
			
		||||
            nickname = get_nickname_from_actor(actor_str)
 | 
			
		||||
            domain, port = get_domain_from_actor(actor_str)
 | 
			
		||||
            domain_full = get_full_domain(domain, port)
 | 
			
		||||
            handle = nickname + '@' + domain_full
 | 
			
		||||
            actors_dict[handle] = orig_str
 | 
			
		||||
        break
 | 
			
		||||
 | 
			
		||||
    if debug:
 | 
			
		||||
        if actors_dict:
 | 
			
		||||
            print('Actors dict created')
 | 
			
		||||
        else:
 | 
			
		||||
            print('No cached actors found')
 | 
			
		||||
 | 
			
		||||
    # get the handles to be checked for movedTo attribute
 | 
			
		||||
    handles_to_check = []
 | 
			
		||||
    for _, dirs, _ in os.walk(base_dir + '/accounts'):
 | 
			
		||||
        for account in dirs:
 | 
			
		||||
            if not is_account_dir(account):
 | 
			
		||||
                continue
 | 
			
		||||
            following_filename = base_dir + '/' + account + '/following.txt'
 | 
			
		||||
            if not os.path.isfile(following_filename):
 | 
			
		||||
                continue
 | 
			
		||||
            following_str = ''
 | 
			
		||||
            try:
 | 
			
		||||
                with open(following_filename, 'r',
 | 
			
		||||
                          encoding='utf-8') as fp_foll:
 | 
			
		||||
                    following_str - fp_foll.read()
 | 
			
		||||
            except OSError:
 | 
			
		||||
                print('EX: update_moved_actors unable to read ' +
 | 
			
		||||
                      following_filename)
 | 
			
		||||
                continue
 | 
			
		||||
            following_list = following_str.split('\n')
 | 
			
		||||
            for handle in following_list:
 | 
			
		||||
                if handle not in handles_to_check:
 | 
			
		||||
                    handles_to_check.append(handle)
 | 
			
		||||
        break
 | 
			
		||||
 | 
			
		||||
    if debug:
 | 
			
		||||
        if handles_to_check:
 | 
			
		||||
            print('All accounts handles list generated')
 | 
			
		||||
        else:
 | 
			
		||||
            print('No accounts are following')
 | 
			
		||||
 | 
			
		||||
    moved_str = ''
 | 
			
		||||
    for handle in handles_to_check:
 | 
			
		||||
        if not actors_dict.get(handle):
 | 
			
		||||
            continue
 | 
			
		||||
        actor_filename = base_dir + '/cache/actors/' + actors_dict[handle]
 | 
			
		||||
        if not os.path.isfile(actor_filename):
 | 
			
		||||
            continue
 | 
			
		||||
        actor_json = load_json(actor_filename, 1, 1)
 | 
			
		||||
        if not actor_json:
 | 
			
		||||
            continue
 | 
			
		||||
        if not actor_json.get('movedTo'):
 | 
			
		||||
            continue
 | 
			
		||||
        moved_str += handle + ' ' + actor_json['movedTo'] + '\n'
 | 
			
		||||
 | 
			
		||||
    if debug:
 | 
			
		||||
        if moved_str:
 | 
			
		||||
            print('Moved accounts detected')
 | 
			
		||||
        else:
 | 
			
		||||
            print('No moved accounts detected')
 | 
			
		||||
 | 
			
		||||
    moved_accounts_filename = base_dir + '/accounts/actors_moved.txt'
 | 
			
		||||
    if not moved_str:
 | 
			
		||||
        if os.path.isfile(moved_accounts_filename):
 | 
			
		||||
            try:
 | 
			
		||||
                os.remove(moved_accounts_filename)
 | 
			
		||||
            except OSError:
 | 
			
		||||
                print('EX: update_moved_actors unable to remove ' +
 | 
			
		||||
                      moved_accounts_filename)
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        with open(moved_accounts_filename, 'w+',
 | 
			
		||||
                  encoding='utf-8') as fp_moved:
 | 
			
		||||
            fp_moved.write(moved_str)
 | 
			
		||||
    except OSError:
 | 
			
		||||
        print('EX: update_moved_actors unable to save ' +
 | 
			
		||||
              moved_accounts_filename)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue