This commit is contained in:
0xd3d0c3d 2022-08-24 03:31:54 -05:00
parent c4e89181c9
commit 23175a5abf
19 changed files with 322 additions and 113 deletions

7
.vscode/launch.json vendored

@ -1,11 +1,8 @@
{ {
// Use IntelliSense to learn about possible attributes. "version": "6.6.6",
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "maplez", "name": "maple",
"type": "python", "type": "python",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/bot_maple.py", "program": "${workspaceFolder}/bot_maple.py",

@ -37,20 +37,19 @@ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdyymMMMMMMMMMMMMMMMMMMMMMMMMMMM
## Summary ## Summary
``` ```
this project is the ( m4plmp - https://git.tcp.direct/decoded/m4pl1mp ) this project is a hybrid of hybrids - ( m4pl1mp - https://git.tcp.direct/decoded/m4pl1mp )
except that this one also uses the matrix protocol and talks to -
matrix and irc servers both. so it's essentialy two clients wrapped this version spans across different networks and not limited to irc, it connects matrix,
in one and not only bridging information between the two networks telegram, discord and offers up a newer way of unifying those services in one core process.
but unifying maple's services between them as well.
``` ```
--- ---
## TODO ## TODO
- plugin wrapper to reduce rewrite the same plugins properties per spanned network -
- intuitive bridge system ## Changelog - v2.6
- raw tcp socket for external service interfacing - fixed bridge responses double echoing
- logical color formatting of strings - simplified the calling of some plugins
- plugin to monitor version control - incorporated a multihead wrapper to keep services running
- plugin to monitor music releases
## Changelog - v2.5 ## Changelog - v2.5
- telegram/discord/matrix/irc now netspanned ( always more to do ) - telegram/discord/matrix/irc now netspanned ( always more to do )
- the routerio logic mostly finished in plugins/tool_bus_plugin.py - the routerio logic mostly finished in plugins/tool_bus_plugin.py

@ -3,11 +3,10 @@ import asyncio
import os import os
import threading import threading
from time import sleep from time import sleep
##################################################channel##################################
import irc3 import irc3
import torch
from nio import AsyncClient, MatrixRoom, RoomMessageText from nio import AsyncClient, MatrixRoom, RoomMessageText
##################################################channel##################################
from plugins.net_discord_plugin import start_discordbot from plugins.net_discord_plugin import start_discordbot
from plugins.net_irc_plugin import config_ircbot, start_ircbot from plugins.net_irc_plugin import config_ircbot, start_ircbot
from plugins.net_matrix_plugin import start_matrixbot from plugins.net_matrix_plugin import start_matrixbot
@ -15,8 +14,7 @@ from plugins.net_telegram_plugin import start_telegrambot
from plugins.tool_bus_plugin import BUS from plugins.tool_bus_plugin import BUS
from plugins.tool_dims_plugin import dims from plugins.tool_dims_plugin import dims
from plugins.tool_guds_plugin import guds from plugins.tool_guds_plugin import guds
#from plugins.tool_colors_plugin import colorform as print
#sfrom plugins.tool_colors_plugin import colorform as print
##################################################channel################################## ##################################################channel##################################
class BOTIO: class BOTIO:
####################################################################################### #######################################################################################
@ -31,6 +29,7 @@ class BOTIO:
self.net_irc=[] self.net_irc=[]
self.net_matrix=[] self.net_matrix=[]
self.net_discord=[] self.net_discord=[]
self.net_discord_initialized=False
print(f'<<< ________botio_class >>> [ ircbot configured ]') print(f'<<< ________botio_class >>> [ ircbot configured ]')
####################################################################################### #######################################################################################
def __boot__irc(self): def __boot__irc(self):

0
personalities/default.db Normal file

@ -65,7 +65,7 @@ class Plugin:
self.bot.send(cmd) self.bot.send(cmd)
self.bot.kick(channel, mask.nick, msg) self.bot.kick(channel, mask.nick, msg)
####################################################################################### #######################################################################################
@command(permission='view', public=True, show_in_help_list=True) @command(permission='view', public=True, show_in_help_list=False)
def v(self, mask, target, args): def v(self, mask, target, args):
"""Voices all present users in channel """Voices all present users in channel
%%v %%v
@ -144,7 +144,7 @@ class Plugin:
def ping(self, mask, target, args): def ping(self, mask, target, args):
pass pass
####################################################################################### #######################################################################################
@command(permission='staff', public=True, show_in_help_list=True) @command(permission='staff', public=True, show_in_help_list=False)
def staff(self, mask, target, args): def staff(self, mask, target, args):
"""staff """staff
%%staff <noise>... %%staff <noise>...

@ -9,7 +9,7 @@ from typing import Type
import random import random
import string import string
import os,ipdb import os,ipdb
from plugins.tool_colors_plugin import colorform as print #from plugins.tool_colors_plugin import colorform as print
from plugins.tool_dims_plugin import dims from plugins.tool_dims_plugin import dims
########################################################################## THE ASCII LOGO TO BE USED ########################################################################## THE ASCII LOGO TO BE USED
MOTD=""" MOTD="""

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- ############################################################### SOF # -*- coding: utf-8 -*- ############################################################### SOF
import asyncio import asyncio
import ipdb
import irc3 import irc3
from irc3.plugins.command import command from irc3.plugins.command import command
@ -16,7 +16,7 @@ class Plugin:
self.bot = bot self.bot = bot
####################################################################################### #######################################################################################
@irc3.extend @irc3.extend
@command(permission='view') @command(permission='admin',show_in_help_list=False)
async def listrooms(self,sender_netroomchan,sender_user,target,): async def listrooms(self,sender_netroomchan,sender_user,target,):
"""listrooms - lists rooms/channels/groups this bot is currently in """listrooms - lists rooms/channels/groups this bot is currently in
%%listrooms %%listrooms
@ -38,7 +38,7 @@ class Plugin:
return results return results
####################################################################################### #######################################################################################
@irc3.extend @irc3.extend
@command(permission='Admin') @command(permission='admin',show_in_help_list=False)
async def listbridges(self,sender_netroomchan,sender_user,target,): async def listbridges(self,sender_netroomchan,sender_user,target,):
"""listbridges - lists rooms/channels/groups this bot is currently in """listbridges - lists rooms/channels/groups this bot is currently in
%%listbridges %%listbridges
@ -71,7 +71,7 @@ class Plugin:
return results return results
####################################################################################### #######################################################################################
@irc3.extend @irc3.extend
@command(permission='view') @command(permission='admin',show_in_help_list=False)
async def addbridge(self,mask,target,args): async def addbridge(self,mask,target,args):
"""addbridge - add a bridge rule for a netspan channel/room/group. use ?listrooms, ?listbridges for information. usage: ?addbridge #b0tsh0p ^χιϛ """addbridge - add a bridge rule for a netspan channel/room/group. use ?listrooms, ?listbridges for information. usage: ?addbridge #b0tsh0p ^χιϛ
%%addbridge <noise>... %%addbridge <noise>...
@ -91,7 +91,7 @@ class Plugin:
return results return results
####################################################################################### #######################################################################################
@irc3.extend @irc3.extend
@command(permission='view') @command(permission='admin',show_in_help_list=False)
async def delbridge(self,mask,target,args): async def delbridge(self,mask,target,args):
"""delbridge - delete a bridge rule for a netspan channel/room/group. use ?listrooms, ?listbridges for information. usage: ?delbridge #b0tsh0p ^χιϛ """delbridge - delete a bridge rule for a netspan channel/room/group. use ?listrooms, ?listbridges for information. usage: ?delbridge #b0tsh0p ^χιϛ
%%delbridge <noise>... %%delbridge <noise>...
@ -111,7 +111,33 @@ class Plugin:
return results return results
####################################################################################### #######################################################################################
@irc3.extend @irc3.extend
@command(permission='admin') @command(permission='admin',show_in_help_list=False)
async def blackhole(self,mask,target,args):
"""blackhole - prevents maple from reverberating on bridges. usage: ?blackhole ?blackhole !asdfasdfasdfsad:pcriot.org add or ?blackhole !asdfasdfasd del
%%blackhole <noise>...
"""
noise=' '.join(args['<noise>']).strip()
if noise=="list":
self.blackhole=[]
ircbot=guds.memory('ircbot')
dbname="blackhole"
db=ircbot.db.getlist(dbname)
if db:
for entry in db:
self.blackhole.append(entry)
return self.blackhole
src_blackhole=noise.split()[0]
command=noise.split()[1]
results=[]
result=dims.blackholes(src_blackhole,command)
results.append(f"[ {src_blackhole} ] - adding blackhole")
msg=f'<<< ________dims_plugin >>> [ addblackhole ] - {src_blackhole}'
print(msg)
return results
#######################################################################################
@irc3.extend
@command(permission='admin',show_in_help_list=False)
async def purgebridges(self, mask=None, target=None, data=None, sender_user=None, sender_netroomchan=None, **kw): async def purgebridges(self, mask=None, target=None, data=None, sender_user=None, sender_netroomchan=None, **kw):
"""purgebridges - erases channel/room message history across nets """purgebridges - erases channel/room message history across nets
%%purgebridges %%purgebridges

@ -27,7 +27,7 @@ class Plugin:
return s return s
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='view') @command(permission='view',show_in_help_list=False)
def emote(self, mask, target, args): def emote(self, mask, target, args):
"""Show Emotion """Show Emotion
%%emote %%emote

@ -301,9 +301,8 @@ class Plugin:
@irc3.event(irc3.rfc.PRIVMSG) @irc3.event(irc3.rfc.PRIVMSG)
def on_privmsg_search_for_maple(self, mask=None, target=None, data=None, **kw): def on_privmsg_search_for_maple(self, mask=None, target=None, data=None, **kw):
############################################## ##############################################
if mask.nick == 'nickserv': if mask.nick.lower()=='nickserv': return
print('returning, message data from bot not user') if target!=self.bot.config['nick'] and mask.nick==self.bot.nick: return
return
if mask.nick == self.bot.config["nick"]: if mask.nick == self.bot.config["nick"]:
if data.startswith("["): if data.startswith("["):
if not data.find("]")==-1: if not data.find("]")==-1:
@ -396,7 +395,7 @@ class Plugin:
from plugins.tool_dims_plugin import dims from plugins.tool_dims_plugin import dims
netschanlist=dims.list_channels_bridged(netsrc=net_src) netschanlist=dims.list_channels_bridged(netsrc=net_src)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
await bridgedbus.input(net_src,[True,net_src,f'{net_user}: {msg}']) await bridgedbus.input(net_src,net_user,msg,True)
####################################################################################### #######################################################################################
def run_chat(self,model,tokenizer,config,mmi_model=None,mmi_tokenizer=None): def run_chat(self,model,tokenizer,config,mmi_model=None,mmi_tokenizer=None):
num_samples=config.getint('decoder','num_samples') num_samples=config.getint('decoder','num_samples')
@ -500,16 +499,16 @@ class Plugin:
self.bot.history.push_maple_messages(maple_message) self.bot.history.push_maple_messages(maple_message)
print(f'maple > {maple_message}') print(f'maple > {maple_message}')
MAPLE_MESSAGE=maple_message.replace('lt 3','<3') MAPLE_MESSAGE=maple_message.replace('lt 3','<3')
msg=f'{USER}: {MAPLE_MESSAGE}' msg=f'{MAPLE_MESSAGE}'
from plugins.tool_bus_plugin import BUS from plugins.tool_bus_plugin import BUS
from plugins.tool_dims_plugin import dims from plugins.tool_dims_plugin import dims
netschanlist=dims.list_channels_bridged(netsrc=TARGET) netschanlist=dims.list_channels_bridged(netsrc=TARGET)
netschanlist.append(TARGET) netschanlist.append(TARGET)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
async def truss(self,TARGET,USER,msg): async def truss(self,TARGET,USER,msg):
await bridgedbus.input(TARGET,[True,TARGET,f'{USER}: {msg}']) await bridgedbus.input(TARGET,USER,msg,True)
asyncio.run_coroutine_threadsafe( bridgedbus.input(TARGET,[True,TARGET,f'{USER}: {msg}'] ), asyncio.get_event_loop() ) asyncio.run_coroutine_threadsafe( bridgedbus.input(TARGET,USER,msg,True), asyncio.get_event_loop() )
# asyncio.run_coroutine_threadsafe(self.truss(TARGET,USER,msg),self.bot.loop)s # asyncio.run_coroutine_threadsafe(self.truss(TARGET,USER,msg),self.bot.loop)
# self.bot.privmsg(TARGET,msg) # self.bot.privmsg(TARGET,msg)
self.bot.history.loopcount=0 self.bot.history.loopcount=0
return True return True

@ -2,7 +2,7 @@
import asyncio import asyncio
import os import os
import re import re
###########################################################################################
import discord import discord
from plugins.tool_colors_plugin import colorform as print from plugins.tool_colors_plugin import colorform as print
import ipdb import ipdb
@ -10,11 +10,10 @@ import irc3
from discord import Client from discord import Client
from discord.ext import commands, tasks from discord.ext import commands, tasks
from irc3.plugins.command import command from irc3.plugins.command import command
###########################################################################################
from plugins.tool_bus_plugin import BUS from plugins.tool_bus_plugin import BUS
from plugins.tool_dims_plugin import dims from plugins.tool_dims_plugin import dims
from plugins.tool_guds_plugin import guds from plugins.tool_guds_plugin import guds
########################################################################################### ###########################################################################################
DISCORD__SCHAN=int(os.environ['DISCORD__SCHAN']) DISCORD__SCHAN=int(os.environ['DISCORD__SCHAN'])
DISCORD__DCODE=int(os.environ['DISCORD__DCODE']) DISCORD__DCODE=int(os.environ['DISCORD__DCODE'])
@ -26,7 +25,7 @@ global client
async def _d_bnc_msg(netsrc,usernick,netdest,data): async def _d_bnc_msg(netsrc,usernick,netdest,data):
netsrc="^{}".format(netsrc) netsrc="^{}".format(netsrc)
bridgedbus=(BUS(netdest)) bridgedbus=(BUS(netdest))
await bridgedbus.input(netsrc,[True,netsrc,f'{usernick}: {data}']) await bridgedbus.input(netsrc,usernick,data,True)
# await bridgedbus.output([netsrc,usernick],data) # await bridgedbus.output([netsrc,usernick],data)
########################################################################################### ###########################################################################################
def d_bnc_msg(netsrc,usernick,netdest,data,): def d_bnc_msg(netsrc,usernick,netdest,data,):
@ -59,6 +58,7 @@ class DISCORDBOT:
print(f'<<< _net_discord_plugin >>> [ discordbot connection made as {globals()["DISCORDBOT"].client.user.name} ]') print(f'<<< _net_discord_plugin >>> [ discordbot connection made as {globals()["DISCORDBOT"].client.user.name} ]')
####################################################################################### #######################################################################################
async def listchannels(self): async def listchannels(self):
print(f"<<< _net_discord_plugin >>> [ event: scanning channels ] - started")
discordchannels=list(globals()['DISCORDBOT'].client.get_all_channels()) discordchannels=list(globals()['DISCORDBOT'].client.get_all_channels())
if discordchannels[0].__class__.__name__=="CategoryChannel" and discordchannels[0].name=='bridged': if discordchannels[0].__class__.__name__=="CategoryChannel" and discordchannels[0].name=='bridged':
for channel in discordchannels[0].channels: for channel in discordchannels[0].channels:
@ -111,6 +111,8 @@ class DISCORDBOT:
client=discordbot.client client=discordbot.client
if message.author.name == client.user.name: if message.author.name == client.user.name:
return return
discordbot=guds.memory('discordbot')
asyncio.run_coroutine_threadsafe(discordbot.listchannels(),discordbot.client.loop)
channel_name=f"^{message.channel.name}" channel_name=f"^{message.channel.name}"
TARGET="^χιϛ" TARGET="^χιϛ"
USER=message.author.name USER=message.author.name
@ -121,7 +123,7 @@ class DISCORDBOT:
netschanlist=dims.list_channels_bridged(netsrc=TARGET) netschanlist=dims.list_channels_bridged(netsrc=TARGET)
netschanlist.append(TARGET) netschanlist.append(TARGET)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
asyncio.run_coroutine_threadsafe(bridgedbus.input(TARGET,[True,TARGET,f'{USER}: {message.content}']),ircbot.loop) asyncio.run_coroutine_threadsafe(bridgedbus.input(TARGET,USER,message.content,True),ircbot.loop)
msg=f'<<< _net_discord_plugin >>> [ (d)({message.channel.id})({channel_name}) ] > {str(message.author)}: {message.content}' msg=f'<<< _net_discord_plugin >>> [ (d)({message.channel.id})({channel_name}) ] > {str(message.author)}: {message.content}'
print(msg) print(msg)
################################################################################### ###################################################################################

142
plugins/net_hydra_plugin.py Normal file

@ -0,0 +1,142 @@
# -*- coding: utf-8 -*- ############################################################### SOF
from irc3.plugins.command import command
from irc3.plugins.cron import cron
from irc3.plugins import core
import irc3
import os
from random import randint as rint
from random import shuffle
from datetime import datetime
###########################################################################################
@irc3.plugin
class Plugin:
#######################################################################################
def __init__(self,bot):
self.bot=bot
try:
self.mode=os.environ['HYDRA_DESIGNATION']
self.home=os.environ['HYDRA_HOME']
self.enforcing=True
else:
self.mode="dupe"
self.mode=""
self.enforcing=False
return
self.color=""
if self.mode=="core": self.color="\x0304"
token=""
for i in range(7): token+=hex(rint(0,255))[2:].zfill(2).upper()
token+=hex(int(datetime.now().timestamp()))[-4:].upper()
token=list(token)
shuffle(token)
self.token=''.join(token)
#######################################################################################
def server_ready(self):
if not self.mode=='core':
self.bot.privmsg("maple",f"[hydra:{self.token}] - dupe - connected")
else:
self.bot.privmsg("maple",f"core - connected")
#######################################################################################
@irc3.event(irc3.rfc.ERR_NICK)
def on_errnick(self,srv=None,retcode=None,me=None,nick=None,data=None):
###################################################################################
if not self.mode=='core': return
msg=f'err_nick - srv:{srv} - retcode:{retcode} - me:{me} - nick:{nick} - data:{data}'
self.bot.privmsg("maple",msg.lower())
#######################################################################################
@irc3.event(irc3.rfc.NEW_NICK)
def on_newnick(self,nick=None,new_nick=None):
###################################################################################
if not self.mode=='core': return
if nick==self.bot.config['nick'] or new_nick==self.bot.config['nick']:
msg=f'new_nick - nick:{nick} - new_nick:{new_nick}'
self.bot.privmsg("maple",msg.lower())
#######################################################################################
@irc3.event(irc3.rfc.CTCP)
def on_ctcp(self,mask=None,event=None,target=None,ctcp=None):
###################################################################################
if not self.mode=='core': return
msg=f'ctcpd - mask:{mask} - event:{event} - target:{target} - ctcp:{ctcp}'
self.bot.privmsg("maple",msg.lower())
#######################################################################################
@irc3.event(irc3.rfc.INVITE)
def on_invite(self,mask=None,channel=None):
###################################################################################
if not self.mode=='core': return
msg=f'invited - mask:{mask} - channel:{channel}'
self.bot.privmsg("maple",msg.lower())
#######################################################################################
@irc3.event(irc3.rfc.KICK)
def on_kick(self,mask=None,event=None,channel=None,target=None,data=None):
###################################################################################
if not self.mode=='core': return
msg=f'kicked - mask:{mask} - event:{event} - target:{target} - data:{data}'
self.bot.privmsg("maple",msg)
#######################################################################################
@irc3.event(irc3.rfc.PRIVMSG)
def on_privmsg(self,mask=None,event=None,target=None,data=None,**kw):
###################################################################################
if target!=self.bot.config['nick'] and mask.nick==self.bot.nick: return
if mask.nick==self.bot.nick and target==self.bot.config['nick'] and self.mode=='core':
if data.endswith('dupe - connected'):
_token=data.split("[hydra:")[1].split("]")[0]
_nekot=_token[::-1]
msg=f'[TOKEN:{_token}] - [NEKOT:{_nekot}] - COLOR:{rint(16,87)}'
self.bot.privmsg(self.bot.config['nick'],msg)
if mask.nick==self.bot.nick and target==self.bot.config['nick'] and self.mode=='dupe':
if not data.find('NEKOT')==-1:
_token=data.split(":")[1].split("]")[0]
if _token.lower()==self.token.lower():
if not data.find("] - [NEKOT:")==-1:
_nekot=data.split("] - [NEKOT:")[1].split("]")[0]
if _token.lower()==_nekot[::-1].lower():
_color=int(data.split(" - COLOR:")[1].strip())
if not self.color:
self.color=f"\x03{str(_color)}"
if self.mode=='core':
msg=f"{self.color}[maple:{self.token}] - "
else:
msg=f"{self.color}[hydra:{self.token}] - "
if mask.nick!=self.bot.config['nick']:
msg+=f'event:{event} - mask:{mask} - target:{target} - data:'
msg+=f'{data}'
if kw: msg+=f" - kw:{kw}"
self.bot.privmsg(self.home,msg.lower())
#######################################################################################
@irc3.event(irc3.rfc.MY_PRIVMSG)
def on_my_privmsg(self,mask=None,event=None,target=None,data=None,**kw):
###################################################################################
pass
#######################################################################################
@irc3.event(irc3.rfc.JOIN_PART_QUIT)
def on_join_part_quit(self,mask=None,target=None,data=None,**kw):
target=kw['channel']
###################################################################################
if mask.nick==self.bot.config['nick']:
###############################################################################
if kw['event']=='JOIN':
self.bot.privmsg("maple",f"joined {target}".lower())
if target!=self.home:
if enforcing:
reason=".[d]."
self.bot.part(target,reason)
self.bot.privmsg("maple",f"parted {target} - {reason}".lower())
if self.mode=="core":
msg=f"[maple:{self.token}] - core - maple online"
self.bot.privmsg(self.home,msg)
else:
msg=f"[hydra:{self.token}] - dupe - hydra online"
self.bot.privmsg(self.home,msg)
if kw['event']=='PART':
if self.mode=="core":
msg=f"[maple:{self.token}] -"
else:
msg=f"[hydra:{self.token}] -"
self.bot.privmsg("maple",msg+f"parted {target} - {data}")
if kw['event']=='QUIT':
if self.mode=="core":
msg=f"[maple:{self.token}] -"
else:
msg=f"[hydra:{self.token}] -"
self.bot.privmsg("maple",msg+f"quit {target} - {data}")
####################################################################################### EOF

@ -35,6 +35,7 @@ def config_ircbot():
plugins.tool_guds_plugin plugins.tool_guds_plugin
plugins.tool_bus_plugin plugins.tool_bus_plugin
plugins.sasl_custom_plugin plugins.sasl_custom_plugin
plugins.net_hydra_plugin
plugins.net_irc_plugin plugins.net_irc_plugin
plugins.net_matrix_plugin plugins.net_matrix_plugin
plugins.net_discord_plugin plugins.net_discord_plugin
@ -67,10 +68,10 @@ def config_ircbot():
plugins.whoami_plugin plugins.whoami_plugin
plugins.joke_plugin plugins.joke_plugin
plugins.maple_plugin plugins.maple_plugin
#plugins.openai_plugin
autojoins = autojoins =
'#b0tsh0p' '#PalletTown'
'#tcpdirect'
flood_burst = 0 flood_burst = 0
flood_rate = 1 flood_rate = 1
@ -126,10 +127,7 @@ def start_ircbot(self):
###################################################################### NET IRC - MAIN [4/4] ###################################################################### NET IRC - MAIN [4/4]
async def _d_irc_msg(target,msg,) -> None: async def _d_irc_msg(target,msg,) -> None:
ircbot=guds.memory('ircbot') ircbot=guds.memory('ircbot')
await ircbot.privmsg( await ircbot.privmsg(target,msg,)
target,
msg,
)
########################################################################################### ###########################################################################################
def d_irc_msg(target,msg,): def d_irc_msg(target,msg,):
self=guds.memory('ircbot') self=guds.memory('ircbot')
@ -161,7 +159,7 @@ class Plugin:
if mask.nick.startswith('maple[m]'): return if mask.nick.startswith('maple[m]'): return
netschanlist=dims.list_channels_bridged(netsrc=target) netschanlist=dims.list_channels_bridged(netsrc=target)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
await bridgedbus.input(target,[True,target,f'{mask.nick}: {data}']) await bridgedbus.input(target,mask.nick,data,True)
else: # bot else: # bot
pass pass
####################################################################################### #######################################################################################

@ -70,8 +70,17 @@ class MATRIXBOT:
return # ignore messages from self, e.g. @maple:pcriot.org return # ignore messages from self, e.g. @maple:pcriot.org
netschanlist=dims.list_channels_bridged(netsrc=room.room_id) netschanlist=dims.list_channels_bridged(netsrc=room.room_id)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
await bridgedbus.input(room.room_id,[True,room.room_id,f'{event.sender}: {event.body}']) await bridgedbus.input(room.room_id,event.sender,event.body,True)
if not event.body.lower().find("maple")==-1: if not event.body.lower().find("maple")==-1:
#######################################################################################
self.blackhole=[]
ircbot=guds.memory('ircbot')
dbname="blackhole"
db=ircbot.db.getlist(dbname)
if db:
for entry in db:
self.blackhole.append(entry)
if not room.room_id in self.blackhole:
ircbot=guds.memory('ircbot') ircbot=guds.memory('ircbot')
asyncio.run_coroutine_threadsafe(ircbot.indirect_maple([event.sender,room.room_id,"#tcpdirect"],event.body),ircbot.loop) asyncio.run_coroutine_threadsafe(ircbot.indirect_maple([event.sender,room.room_id,"#tcpdirect"],event.body),ircbot.loop)
if event.body.startswith("?"): if event.body.startswith("?"):

@ -50,7 +50,7 @@ class TELEGRAMBOT:
####################################################################################### #######################################################################################
async def _t_bnc_msg(self,netsrc,usernick,netdest,data,): async def _t_bnc_msg(self,netsrc,usernick,netdest,data,):
bridgedbus=(BUS(netdest)) bridgedbus=(BUS(netdest))
await bridgedbus.input(f"${netsrc}",[True,usernick,data]) await bridgedbus.input(f"${netsrc}",usernick,data,True)
########################################################################################### ###########################################################################################
def t_bnc_msg(self,netsrc,usernick,netdest,data,): def t_bnc_msg(self,netsrc,usernick,netdest,data,):
ircbot=guds.memory('ircbot') ircbot=guds.memory('ircbot')
@ -91,7 +91,7 @@ class TELEGRAMBOT:
netschanlist=dims.list_channels_bridged(netsrc=TARGET) netschanlist=dims.list_channels_bridged(netsrc=TARGET)
netschanlist.append(TARGET) netschanlist.append(TARGET)
bridgedbus=(BUS(netschanlist)) bridgedbus=(BUS(netschanlist))
asyncio.run_coroutine_threadsafe(bridgedbus.input(TARGET,[True,TARGET,f'{USER}: {msg}']),self.ircbot.loop) asyncio.run_coroutine_threadsafe(bridgedbus.input(TARGET,USER,msg,True),self.ircbot.loop)
####################################################################################### #######################################################################################
def error(self,update,context): def error(self,update,context):
self.logger.warning('Update "%s" caused error "%s"',update,context.error) self.logger.warning('Update "%s" caused error "%s"',update,context.error)

@ -23,7 +23,7 @@ class Plugin:
return self.note(*args) return self.note(*args)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='admin', public=True, show_in_help_list=True) @command(permission='admin', public=True, show_in_help_list=False)
def note(self, mask, target, args): def note(self, mask, target, args):
"""list/write/del notes """list/write/del notes
%%note [<cmd>] [<operation>] %%note [<cmd>] [<operation>]
@ -44,7 +44,7 @@ class Plugin:
return return
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='admin', public=True, show_in_help_list=True) @command(permission='admin', public=True, show_in_help_list=False)
def note_del(self, mask, target, args): def note_del(self, mask, target, args):
"""Delete Note or * for all notes """Delete Note or * for all notes
%%note <cmd> <operation> %%note <cmd> <operation>
@ -75,7 +75,7 @@ class Plugin:
self.bot.privmsg(target, msg) self.bot.privmsg(target, msg)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='admin', public=True, show_in_help_list=True) @command(permission='admin', public=True, show_in_help_list=False)
def note_list(self, mask, target, args): def note_list(self, mask, target, args):
"""List All Note Names """List All Note Names
%%note list %%note list
@ -96,7 +96,7 @@ class Plugin:
self.bot.privmsg(target, msg) self.bot.privmsg(target, msg)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='admin', public=True, show_in_help_list=True) @command(permission='admin', public=True, show_in_help_list=False)
def note_read(self, mask, target, args): def note_read(self, mask, target, args):
"""Display Note """Display Note
%%note read <operation> %%note read <operation>
@ -140,7 +140,7 @@ class Plugin:
self.bot.privmsg(target, msg) self.bot.privmsg(target, msg)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='admin', public=True, show_in_help_list=True) @command(permission='admin', public=True, show_in_help_list=False)
def note_write(self, mask, target, args): def note_write(self, mask, target, args):
"""Add Note """Add Note
%%note write <note> %%note write <note>

@ -42,6 +42,9 @@ class Plugin:
user=noise.split(' ')[0] user=noise.split(' ')[0]
noise=noise.split(' ')[1:] noise=noise.split(' ')[1:]
message=' '.join(noise) message=' '.join(noise)
if not message:
self.quotes(mask,target,{'<nick>': user})
return
status='' status=''
try: try:
quote_list=self.bot.db.getlist("quotes") quote_list=self.bot.db.getlist("quotes")
@ -61,7 +64,7 @@ class Plugin:
self.bot.privmsg(target,msg) self.bot.privmsg(target,msg)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='view') @command(permission='view',show_in_help_list=False)
def quotes(self, mask, target, args): def quotes(self, mask, target, args):
"""quotes user """quotes user
%%quotes <nick> %%quotes <nick>

@ -68,7 +68,7 @@ class BUS:
msg=f'<<< ____tool_bus_plugin >>> [ BUS.output ] - {self.sortnet(chanroom)}({chanroom})({usernick})->{self.sortnet(target)}({target}) > {data}' msg=f'<<< ____tool_bus_plugin >>> [ BUS.output ] - {self.sortnet(chanroom)}({chanroom})({usernick})->{self.sortnet(target)}({target}) > {data}'
print(msg) print(msg)
####################################################################################### #######################################################################################
async def input(self,network_chanroom_user_src,DATA): async def input(self,network_chanroom_user_src,user_src,data,verbose_bridge):
prefix_src="" prefix_src=""
if network_chanroom_user_src.startswith('!'): prefix_src="m" if network_chanroom_user_src.startswith('!'): prefix_src="m"
elif network_chanroom_user_src.startswith('#'): prefix_src="i" elif network_chanroom_user_src.startswith('#'): prefix_src="i"
@ -82,82 +82,91 @@ class BUS:
from plugins.net_discord_plugin import d_discord_msg from plugins.net_discord_plugin import d_discord_msg
from plugins.net_telegram_plugin import d_telegram_msg from plugins.net_telegram_plugin import d_telegram_msg
#################################################################### ROUTER #################################################################### ROUTER
brindicator=DATA[0] # verbose_bridge=DATA[0]
user_src=f'{DATA[1]}' # user_src=f'{DATA[1]}'
data=DATA[2] # data=DATA[2]
if type(data)==list: if type(data)==list:
for _data in data: for _data in data:
########################################################### TELEGRAM ########################################################### TELEGRAM
if network_chanroom_dest.startswith('$'): if network_chanroom_dest.startswith('$'):
if brindicator: if verbose_bridge:
_u,_d=_data.split(":",1) # _u,_d=_data.split(":",1)
_d=regex.sub("",_d) _data=regex.sub("",_data)
msg=f'[{_u}{user_src}]{_d}' #msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {_data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_telegram_msg(network_chanroom_dest,msg) d_telegram_msg(network_chanroom_dest,msg)
########################################################### DISCORD ########################################################### DISCORD
if network_chanroom_dest.startswith('^'): if network_chanroom_dest.startswith('^'):
if brindicator: if verbose_bridge:
_u,_d=_data.split(":",1) # _u,_d=_data.split(":",1)
_d=regex.sub("",_d) _data=regex.sub("",_data)
msg=f'`[{_u}{user_src}]`{_d}' #msg=f'`[{_u}{user_src}]`{_d}'
msg=f'{user_src}: {_data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_discord_msg(network_chanroom_dest,msg) d_discord_msg(network_chanroom_dest,msg)
############################################################ MATRIX ############################################################ MATRIX
if network_chanroom_dest.startswith('!'): if network_chanroom_dest.startswith('!'):
if brindicator: if verbose_bridge:
_u,_d=_data.split(":",1) # _u,_d=_data.split(":",1)
_d=regex.sub("",_d) _data=regex.sub("",_data)
msg=f'[{_u}{user_src}]{_d}' #msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {_data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_matrix_msg(network_chanroom_dest,msg) d_matrix_msg(network_chanroom_dest,msg)
############################################################### IRC ############################################################### IRC
elif network_chanroom_dest.startswith('#'): elif network_chanroom_dest.startswith('#'):
if brindicator: if verbose_bridge:
_u,_d=_data.split(":",1) # _u,_d=_data.split(":",1)
msg=f'[{_u}{user_src}]{_d}' _data=regex.sub("",_data)
#msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {_data.strip()}'
else: else:
msg=f'{_data}' msg=f'{_data.strip()}'
d_irc_msg(network_chanroom_dest,msg) d_irc_msg(network_chanroom_dest,msg)
############################################################# LOCAL ############################################################# LOCAL
else: else:
############################################################### TELEGRAM ############################################################### TELEGRAM
if network_chanroom_dest.startswith('$'): if network_chanroom_dest.startswith('$'):
if brindicator: if verbose_bridge:
_u,_d=data.split(":",1) # _u,_d=data.split(":",1)
_d=regex.sub("",_d) data=regex.sub("",data)
msg=f'[{_u}{user_src}]{_d}' #msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_telegram_msg(network_chanroom_dest,msg) d_telegram_msg(network_chanroom_dest,msg)
############################################################### DISCORD ############################################################### DISCORD
if network_chanroom_dest.startswith('^'): if network_chanroom_dest.startswith('^'):
if brindicator: if verbose_bridge:
_u,_d=data.split(":",1) # _u,_d=data.split(":",1)
_d=regex.sub("",_d) data=regex.sub("",data)
msg=f'`[{_u}{user_src}]`{_d}' #msg=f'`[{_u}{user_src}]`{_d}'
msg=f'{user_src}: {data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_discord_msg(network_chanroom_dest,msg) d_discord_msg(network_chanroom_dest,msg)
################################################################ MATRIX ################################################################ MATRIX
if network_chanroom_dest.startswith('!'): if network_chanroom_dest.startswith('!'):
if brindicator: if verbose_bridge:
_u,_d=data.split(":",1) # _u,_d=data.split(":",1)
_d=regex.sub("",_d) data=regex.sub("",data)
msg=f'[{_u}{user_src}]{_d}' #msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {data.strip()}'
else: else:
msg=regex.sub("",data) msg=regex.sub("",data)
d_matrix_msg(network_chanroom_dest,msg) d_matrix_msg(network_chanroom_dest,msg)
################################################################### IRC ################################################################### IRC
elif network_chanroom_dest.startswith('#'): elif network_chanroom_dest.startswith('#'):
if brindicator: if verbose_bridge:
_u,_d=data.split(":",1) # _u,_d=data.split(":",1)
msg=f'[{_u}{user_src}]{_d}' data=regex.sub("",data)
#msg=f'[{_u}{user_src}]{_d}'
msg=f'{user_src}: {data.strip()}'
else: else:
msg=f'{data}' msg=f'{data.strip()}'
d_irc_msg(network_chanroom_dest,msg) d_irc_msg(network_chanroom_dest,msg)
################################################################# LOCAL
####################################################################################### EOF ####################################################################################### EOF

@ -11,6 +11,7 @@
from plugins.tool_guds_plugin import guds from plugins.tool_guds_plugin import guds
import asyncio import asyncio
global dims global dims
import ipdb
########################################################################################### ###########################################################################################
class DIMS: class DIMS:
####################################################################################### #######################################################################################
@ -338,6 +339,32 @@ class DIMS:
# except Exception as e: # except Exception as e:
# return False,e # return False,e
####################################################################################### #######################################################################################
def blackholes(self,src_blackhole,cmd=None):
ipdb.set_trace()
self.blackhole=[]
ircbot=guds.memory('ircbot')
dbname="blackhole"
db=ircbot.db.getlist(dbname)
if not db:
db=[]
for entry in db:
self.blackhole.append(entry)
if cmd=="add":
try:
self.blackhole.append(src_blackhole)
ircbot.db.setlist(dbname,self.blackhole)
except:
pass
elif cmd=="del":
try:
self.blackhole.remove(src_blackhole)
ircbot.db.setlist(dbname,self.blackhole)
except:
pass
return self.blackhole
def bridge_routes(self,src_outbound,dest_inbound,cmd=None): def bridge_routes(self,src_outbound,dest_inbound,cmd=None):
err_chan="bot is not in this channel/room/group: {}" err_chan="bot is not in this channel/room/group: {}"
err_dupe="this channel/room/group is a duplicate: {}" err_dupe="this channel/room/group is a duplicate: {}"
@ -535,6 +562,7 @@ class DIMS:
####################################################################################### #######################################################################################
def list_channels(self): def list_channels(self):
################################################################################### ###################################################################################
self.netschanroom=[]
ircbot=guds.memory('ircbot') ircbot=guds.memory('ircbot')
dbname="matrixchat" dbname="matrixchat"
db=ircbot.db.getlist(dbname) db=ircbot.db.getlist(dbname)
@ -556,8 +584,6 @@ class DIMS:
if db: if db:
for entry in db: for entry in db:
self.netschanroom.append(entry[0]) self.netschanroom.append(entry[0])
# for _irc in self.irc: # for _irc in self.irc:
# for _channels in _irc.channels: # for _channels in _irc.channels:
# self.netschanroom.append(_channels.channel) # self.netschanroom.append(_channels.channel)

@ -103,7 +103,7 @@ class Plugin:
return(search_result) return(search_result)
####################################################################################### #######################################################################################
####################################################################################### #######################################################################################
@command(permission='view', public=True, show_in_help_list=True) @command(permission='view', public=True, show_in_help_list=False)
def y(self, *args, **kwargs): def y(self, *args, **kwargs):
"""Search for youtube video """Search for youtube video
%%y <keyword>... %%y <keyword>...