uncia/uncia/database/put.py

126 lines
2.3 KiB
Python

import json
from datetime import datetime
from izzylib import DotDict, logging
from urllib.parse import urlparse
def cmd_ban(self, handle=None, domain=None, reason=None):
row = self.get.ban(handle, domain)
if row:
if reason:
row = self.update(row=row, reason=reason, return_row=True)
else:
logging.verbose('Banned user or instance already exists')
return
else:
row = self.insert('ban',
handle = handle,
domain = domain,
reason = reason,
timestamp = datetime.now(),
return_row = True
)
return row
def cmd_actor(self, url, actor):
row = self.get.actor(url)
if row:
row = self.update(
row = row,
data = actor,
timestamp = datetime.now(),
return_row = True
)
else:
row = self.insert('actor_cache',
url = url,
data = actor,
timestamp = datetime.now(),
return_row = True
)
self.cache.actor_cache.store(url, row)
return row
def cmd_config(self, key, value=None):
row = self.fetch('config', key=key)
if not value:
value = self.config_defaults[key][0]
if type(value) == DotDict:
value = value.to_json()
elif type(value) in [dict, list, set, tuple]:
value = json.dumps(value)
if row:
self.update(row=row, value=value)
else:
self.insert('config', key=key, value=value)
self.cache.config.store(key, value)
return value
def cmd_instance(self, inbox, actor, followid=None):
if self.get.instance(inbox):
logging.verbose(f'Inbox already in database: {inbox}')
return
row = self.insert('inbox',
domain = urlparse(inbox).netloc,
inbox = inbox,
actor = actor,
followid = followid,
timestamp = datetime.now(),
return_row = True
)
return row
def cmd_retry(self, inbox, data, headers={}, timestamp=None):
instance = self.get.instance(inbox)
row = instance.retry(data.id)
if not row:
logging.verbose(f'Putting new retry in db for {instance.domain}: {data.id}')
row = self.insert('retry',
msgid = data.id,
inboxid = instance.id,
data = data,
headers = headers,
timestamp = timestamp or datetime.now(),
return_row = True
)
else:
logging.verbose(f'Retry for {instance.domain} already in db: {data.id}')
return row
def cmd_whitelist(self, domain):
row = self.fetch('whitelist', domain=domain)
if row:
logging.verbose(f'Domain already in the whitelist: {domain}')
return
self.insert('whitelist',
domain = domain,
timestamp = datetime.now()
)