mirror of https://gitlab.com/bashrc2/epicyon
				
				
				
			
		
			
				
	
	
		
			140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
| __filename__ = "petnames.py"
 | |
| __author__ = "Bob Mottram"
 | |
| __license__ = "AGPL3+"
 | |
| __version__ = "1.3.0"
 | |
| __maintainer__ = "Bob Mottram"
 | |
| __email__ = "bob@libreserver.org"
 | |
| __status__ = "Production"
 | |
| __module_group__ = "Core"
 | |
| 
 | |
| import os
 | |
| from utils import acct_dir
 | |
| 
 | |
| 
 | |
| def set_pet_name(base_dir: str, nickname: str, domain: str,
 | |
|                  handle: str, petname: str) -> bool:
 | |
|     """Adds a new petname
 | |
|     """
 | |
|     if '@' not in handle:
 | |
|         return False
 | |
|     if ' ' in petname:
 | |
|         petname = petname.replace(' ', '_')
 | |
|     if handle.startswith('@'):
 | |
|         handle = handle[1:]
 | |
|     if petname.startswith('@'):
 | |
|         petname = petname[1:]
 | |
|     petnames_filename = acct_dir(base_dir, nickname, domain) + '/petnames.txt'
 | |
|     entry = petname + ' ' + handle + '\n'
 | |
| 
 | |
|     # does this entry already exist?
 | |
|     if os.path.isfile(petnames_filename):
 | |
|         with open(petnames_filename, 'r') as petnames_file:
 | |
|             petnames_str = petnames_file.read()
 | |
|             if entry in petnames_str:
 | |
|                 return True
 | |
|             if ' ' + handle + '\n' in petnames_str:
 | |
|                 petnames_list = petnames_str.split('\n')
 | |
|                 new_petnames_str = ''
 | |
|                 for pet in petnames_list:
 | |
|                     if not pet.endswith(' ' + handle):
 | |
|                         new_petnames_str += pet + '\n'
 | |
|                     else:
 | |
|                         new_petnames_str += entry
 | |
|                 # save the updated petnames file
 | |
|                 try:
 | |
|                     with open(petnames_filename, 'w+') as petnames_file:
 | |
|                         petnames_file.write(new_petnames_str)
 | |
|                 except OSError:
 | |
|                     print('EX: unable to save ' + petnames_filename)
 | |
|                     return False
 | |
|                 return True
 | |
|             # entry does not exist in the petnames file
 | |
|             try:
 | |
|                 with open(petnames_filename, 'a+') as petnames_file:
 | |
|                     petnames_file.write(entry)
 | |
|             except OSError:
 | |
|                 print('EX: unable to append ' + petnames_filename)
 | |
|                 return False
 | |
|             return True
 | |
| 
 | |
|     # first entry
 | |
|     try:
 | |
|         with open(petnames_filename, 'w+') as petnames_file:
 | |
|             petnames_file.write(entry)
 | |
|     except OSError:
 | |
|         print('EX: unable to write ' + petnames_filename)
 | |
|         return False
 | |
|     return True
 | |
| 
 | |
| 
 | |
| def get_pet_name(base_dir: str, nickname: str, domain: str,
 | |
|                  handle: str) -> str:
 | |
|     """Given a handle returns the petname
 | |
|     """
 | |
|     if '@' not in handle:
 | |
|         return ''
 | |
|     if handle.startswith('@'):
 | |
|         handle = handle[1:]
 | |
|     petnames_filename = acct_dir(base_dir, nickname, domain) + '/petnames.txt'
 | |
| 
 | |
|     if not os.path.isfile(petnames_filename):
 | |
|         return ''
 | |
|     with open(petnames_filename, 'r') as petnames_file:
 | |
|         petnames_str = petnames_file.read()
 | |
|         if ' ' + handle + '\n' in petnames_str:
 | |
|             petnames_list = petnames_str.split('\n')
 | |
|             for pet in petnames_list:
 | |
|                 if pet.endswith(' ' + handle):
 | |
|                     return pet.replace(' ' + handle, '').strip()
 | |
|         elif ' ' + handle.lower() + '\n' in petnames_str.lower():
 | |
|             petnames_list = petnames_str.split('\n')
 | |
|             handle = handle.lower()
 | |
|             for pet in petnames_list:
 | |
|                 if pet.lower().endswith(' ' + handle):
 | |
|                     handle2 = pet.split(' ')[-1]
 | |
|                     return pet.replace(' ' + handle2, '').strip()
 | |
|     return ''
 | |
| 
 | |
| 
 | |
| def _get_pet_name_handle(base_dir: str, nickname: str, domain: str,
 | |
|                          petname: str) -> str:
 | |
|     """Given a petname returns the handle
 | |
|     """
 | |
|     if petname.startswith('@'):
 | |
|         petname = petname[1:]
 | |
|     petnames_filename = acct_dir(base_dir, nickname, domain) + '/petnames.txt'
 | |
| 
 | |
|     if not os.path.isfile(petnames_filename):
 | |
|         return ''
 | |
|     with open(petnames_filename, 'r') as petnames_file:
 | |
|         petnames_str = petnames_file.read()
 | |
|         if petname + ' ' in petnames_str:
 | |
|             petnames_list = petnames_str.split('\n')
 | |
|             for pet in petnames_list:
 | |
|                 if pet.startswith(petname + ' '):
 | |
|                     handle = pet.replace(petname + ' ', '').strip()
 | |
|                     return handle
 | |
|     return ''
 | |
| 
 | |
| 
 | |
| def resolve_petnames(base_dir: str, nickname: str, domain: str,
 | |
|                      content: str) -> str:
 | |
|     """Replaces petnames with their full handles
 | |
|     """
 | |
|     if not content:
 | |
|         return content
 | |
|     if ' ' not in content:
 | |
|         return content
 | |
|     words = content.strip().split(' ')
 | |
|     for wrd in words:
 | |
|         # check initial words beginning with @
 | |
|         if not wrd.startswith('@'):
 | |
|             break
 | |
|         # does a petname handle exist for this?
 | |
|         handle = _get_pet_name_handle(base_dir, nickname, domain, wrd)
 | |
|         if not handle:
 | |
|             continue
 | |
|         # replace the petname with the handle
 | |
|         content = content.replace(wrd + ' ', '@' + handle + ' ')
 | |
|     return content
 |