Enable usage of private chat on groupchat

This commit is contained in:
Schimon Jehudah 2024-01-27 17:15:28 +00:00
parent 4406e61fbe
commit 9094921b40
8 changed files with 414 additions and 371 deletions

View file

@ -252,14 +252,14 @@ def get_default_config_directory():
return os.path.join(config_home, 'slixfeed') return os.path.join(config_home, 'slixfeed')
def get_pathname_to_database(jid): def get_pathname_to_database(jid_file):
""" """
Callback function to instantiate action on database. Callback function to instantiate action on database.
Parameters Parameters
---------- ----------
jid : str jid_file : str
Jabber ID. Filename.
callback : ? callback : ?
Function name. Function name.
message : str, optional message : str, optional
@ -276,7 +276,7 @@ def get_pathname_to_database(jid):
os.mkdir(db_dir) os.mkdir(db_dir)
if not os.path.isdir(db_dir + "/sqlite"): if not os.path.isdir(db_dir + "/sqlite"):
os.mkdir(db_dir + "/sqlite") os.mkdir(db_dir + "/sqlite")
db_file = os.path.join(db_dir, "sqlite", r"{}.db".format(jid)) db_file = os.path.join(db_dir, "sqlite", r"{}.db".format(jid_file))
sqlite.create_tables(db_file) sqlite.create_tables(db_file)
return db_file return db_file
# await set_default_values(db_file) # await set_default_values(db_file)

View file

@ -103,7 +103,8 @@ async def start_tasks_xmpp(self, jid, tasks):
task_manager[jid]["status"] = asyncio.create_task( task_manager[jid]["status"] = asyncio.create_task(
send_status(self, jid)) send_status(self, jid))
case "interval": case "interval":
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
update_interval = ( update_interval = (
await get_settings_value(db_file, "interval") or await get_settings_value(db_file, "interval") or
get_value("settings", "Settings", "interval") get_value("settings", "Settings", "interval")
@ -176,7 +177,8 @@ async def task_jid(self, jid):
jid : str jid : str
Jabber ID. Jabber ID.
""" """
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
enabled = ( enabled = (
await get_settings_value(db_file, "enabled") or await get_settings_value(db_file, "enabled") or
get_value("settings", "Settings", "enabled") get_value("settings", "Settings", "enabled")
@ -229,7 +231,8 @@ async def send_update(self, jid, num=None):
Number. The default is None. Number. The default is None.
""" """
logging.debug("Sending a news update to JID {}".format(jid)) logging.debug("Sending a news update to JID {}".format(jid))
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
enabled = ( enabled = (
await get_settings_value(db_file, "enabled") or await get_settings_value(db_file, "enabled") or
get_value("settings", "Settings", "enabled") get_value("settings", "Settings", "enabled")
@ -246,7 +249,7 @@ async def send_update(self, jid, num=None):
results = await get_unread_entries(db_file, num) results = await get_unread_entries(db_file, num)
news_digest = '' news_digest = ''
media = None media = None
chat_type = await utility.jid_type(self, jid) chat_type = await utility.get_chat_type(self, jid)
for result in results: for result in results:
ix = result[0] ix = result[0]
title_e = result[1] title_e = result[1]
@ -356,7 +359,8 @@ async def send_status(self, jid):
logging.debug( logging.debug(
"Sending a status message to JID {}".format(jid)) "Sending a status message to JID {}".format(jid))
status_text = "📜️ Slixfeed RSS News Bot" status_text = "📜️ Slixfeed RSS News Bot"
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
enabled = ( enabled = (
await get_settings_value(db_file, "enabled") or await get_settings_value(db_file, "enabled") or
get_value("settings", "Settings", "enabled") get_value("settings", "Settings", "enabled")
@ -426,7 +430,8 @@ async def refresh_task(self, jid, callback, key, val=None):
"Refreshing task {} for JID {}".format(callback, jid) "Refreshing task {} for JID {}".format(callback, jid)
) )
if not val: if not val:
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
val = ( val = (
await get_settings_value(db_file, key) or await get_settings_value(db_file, key) or
get_value("settings", "Settings", key) get_value("settings", "Settings", key)
@ -481,7 +486,8 @@ async def check_updates(jid):
"Scanning for updates for JID {}".format(jid) "Scanning for updates for JID {}".format(jid)
) )
while True: while True:
db_file = get_pathname_to_database(jid) jid_file = jid.replace('/', '_')
db_file = get_pathname_to_database(jid_file)
urls = await get_feeds_url(db_file) urls = await get_feeds_url(db_file)
for url in urls: for url in urls:
await action.scan(db_file, url) await action.scan(db_file, url)

View file

@ -7,11 +7,11 @@ from slixmpp.plugins.xep_0048.stanza import Bookmarks
async def add(self, muc_jid): async def add(self, muc_jid):
result = await self.plugin['xep_0048'].get_bookmarks() result = await self.plugin['xep_0048'].get_bookmarks()
bookmarks = result["private"]["bookmarks"] bookmarks = result['private']['bookmarks']
conferences = bookmarks["conferences"] conferences = bookmarks['conferences']
mucs = [] mucs = []
for conference in conferences: for conference in conferences:
jid = conference["jid"] jid = conference['jid']
mucs.extend([jid]) mucs.extend([jid])
if muc_jid not in mucs: if muc_jid not in mucs:
bookmarks = Bookmarks() bookmarks = Bookmarks()
@ -34,18 +34,18 @@ async def add(self, muc_jid):
async def get(self): async def get(self):
result = await self.plugin['xep_0048'].get_bookmarks() result = await self.plugin['xep_0048'].get_bookmarks()
bookmarks = result["private"]["bookmarks"] bookmarks = result['private']['bookmarks']
conferences = bookmarks["conferences"] conferences = bookmarks['conferences']
return conferences return conferences
async def remove(self, muc_jid): async def remove(self, muc_jid):
result = await self.plugin['xep_0048'].get_bookmarks() result = await self.plugin['xep_0048'].get_bookmarks()
bookmarks = result["private"]["bookmarks"] bookmarks = result['private']['bookmarks']
conferences = bookmarks["conferences"] conferences = bookmarks['conferences']
mucs = [] mucs = []
for conference in conferences: for conference in conferences:
jid = conference["jid"] jid = conference['jid']
mucs.extend([jid]) mucs.extend([jid])
if muc_jid in mucs: if muc_jid in mucs:
bookmarks = Bookmarks() bookmarks = Bookmarks()

View file

@ -165,7 +165,10 @@ class Slixfeed(slixmpp.ClientXMPP):
async def on_session_end(self, event): async def on_session_end(self, event):
message = "Session has ended. Reason: {}".format(event) if event:
message = "Session has ended. Reason: {}".format(event)
else:
message = "Session has ended."
await connect.recover_connection(self, event, message) await connect.recover_connection(self, event, message)
@ -189,7 +192,7 @@ class Slixfeed(slixmpp.ClientXMPP):
# TODO Request for subscription # TODO Request for subscription
async def on_message(self, message): async def on_message(self, message):
jid = message["from"].bare jid = message["from"].bare
if "chat" == await utility.jid_type(self, jid): if "chat" == await utility.get_chat_type(self, jid):
await roster.add(self, jid) await roster.add(self, jid)
await state.request(self, jid) await state.request(self, jid)
# chat_type = message["type"] # chat_type = message["type"]

View file

@ -150,7 +150,10 @@ class SlixfeedComponent(slixmpp.ComponentXMPP):
async def on_session_end(self, event): async def on_session_end(self, event):
message = "Session has ended. Reason: {}".format(event) if event:
message = "Session has ended. Reason: {}".format(event)
else:
message = "Session has ended."
await connect.recover_connection(self, event, message) await connect.recover_connection(self, event, message)
@ -173,10 +176,8 @@ class SlixfeedComponent(slixmpp.ComponentXMPP):
# TODO Request for subscription # TODO Request for subscription
async def on_message(self, message): async def on_message(self, message):
# print(message) # jid = message["from"].bare
# breakpoint() # if "chat" == await utility.get_chat_type(self, jid):
jid = message["from"].bare
# if "chat" == await utility.jid_type(self, jid):
# await roster.add(self, jid) # await roster.add(self, jid)
# await state.request(self, jid) # await state.request(self, jid)
# chat_type = message["type"] # chat_type = message["type"]

File diff suppressed because it is too large Load diff

View file

@ -44,7 +44,7 @@ async def add(self, jid):
------- -------
None. None.
""" """
if await utility.jid_type(self, jid) == "groupchat": if await utility.get_chat_type(self, jid) == "groupchat":
# Check whether JID is in bookmarks; otherwise, add it. # Check whether JID is in bookmarks; otherwise, add it.
print(jid, "is muc") print(jid, "is muc")
return return

View file

@ -5,10 +5,18 @@ from slixmpp.exceptions import IqTimeout
import logging import logging
async def jid_type(self, jid): async def get_chat_type(self, jid):
""" """
Check whether a JID is of MUC. Check whether a JID is of MUC.
If iqresult["disco_info"]["features"] contains XML namespace
of 'http://jabber.org/protocol/muc', then it is a "groupchat".
Unless it has forward slash, which would indicate that it is
a chat which is conducted through a groupchat.
Otherwise, determine type "chat".
Parameters Parameters
---------- ----------
jid : str jid : str
@ -16,7 +24,7 @@ async def jid_type(self, jid):
Returns Returns
------- -------
str chat_type : str
"chat" or "groupchat. "chat" or "groupchat.
""" """
try: try:
@ -25,12 +33,14 @@ async def jid_type(self, jid):
# identity = iqresult['disco_info']['identities'] # identity = iqresult['disco_info']['identities']
# if 'account' in indentity: # if 'account' in indentity:
# if 'conference' in indentity: # if 'conference' in indentity:
if 'http://jabber.org/protocol/muc' in features: if ('http://jabber.org/protocol/muc' in features) and not ('/' in jid):
return "groupchat" chat_type = "groupchat"
# TODO elif <feature var='jabber:iq:gateway'/> # TODO elif <feature var='jabber:iq:gateway'/>
# NOTE Is it needed? We do not interact with gateways or services # NOTE Is it needed? We do not interact with gateways or services
else: else:
return "chat" chat_type = "chat"
print('JID {} chat type is {}'.format(jid, chat_type))
return chat_type
# TODO Test whether this exception is realized # TODO Test whether this exception is realized
except IqTimeout as e: except IqTimeout as e:
messages = [ messages = [