diff --git a/hydra_core__standalone/hydra_core__standalone/databases/emote.db b/hydra_core__standalone/hydra_core__standalone/databases/emote.db deleted file mode 100644 index 49fcf43..0000000 --- a/hydra_core__standalone/hydra_core__standalone/databases/emote.db +++ /dev/null @@ -1,426 +0,0 @@ -¢‿¢ -©¿© o -ª{•̃̾_•̃̾}ª -¬_¬ -¯\(º_o)/¯ -¯\(º o)/¯ -¯\_(⊙︿⊙)_/¯ -¯\_(ツ)_/¯ -°ω° -°Д° -°‿‿° -°ﺑ° -´ ▽ ` )ノ -¿ⓧ_ⓧﮌ -Ò,ó -ó‿ó -ô⌐ô -ôヮô -ŎםŎ -ŏﺡó -ʕ•̫͡•ʔ -ʕ•ᴥ•ʔ -ʘ‿ʘ -˚•_•˚ -˚⌇˚ -˚▱˚ - ̿ ̿̿'̿'\̵͇̿̿\=(•̪●)=/̵͇̿̿/'̿̿ ̿ ̿ ̿ - ͡° ͜ʖ ͡° -Σ ◕ ◡ ◕ -Σ (゚Д゚;) -Σ(゚Д゚;≡;゚д゚) -Σ(゚Д゚ ) -Σ(||゚Д゚) -Φ,Φ -δﺡό -σ_σ -д_д -ф_ф -щ(゚Д゚щ) -щ(ಠ益ಠщ) -щ(ಥДಥщ) -Ծ_Ծ -أ‿أ -ب_ب -ح˚௰˚づ -ح˚ᆺ˚ว -حᇂﮌᇂ) -٩๏̯͡๏۶ -٩๏̯͡๏)۶ -٩◔̯◔۶ -٩(×̯×)۶ -٩(̾●̮̮̃̾•̃̾)۶ -٩(͡๏̯͡๏)۶ -٩(͡๏̯ ͡๏)۶ -٩(ಥ_ಥ)۶ -٩(•̮̮̃•̃)۶ -٩(●̮̮̃•̃)۶ -٩(●̮̮̃●̃)۶ -٩(。͡•‿•。)۶ -٩(-̮̮̃•̃)۶ -٩(-̮̮̃-̃)۶ -۞_۞ -۞_۟۞ -۹ↁﮌↁ -۹⌤_⌤۹ - ॓_॔ -१✌◡✌५ -१|˚–˚|५ -ਉ_ਉ -ଘ_ଘ -இ_இ -ఠ_ఠ -రృర -ಠ¿ಠi -ಠ‿ಠ -ಠ⌣ಠ -ಠ╭╮ಠ -ಠ▃ಠ -ಠ◡ಠ -ಠ益ಠ -ಠ益ಠ -ಠ︵ಠ凸 -ಠ , ಥ -ಠ.ಠ -ಠoಠ -ಠ_ృ -ಠ_ಠ -ಠ_๏ -ಠ~ಠ -ಡ_ಡ -ತಎತ -ತ_ತ -ಥдಥ -ಥ‿ಥ -ಥ⌣ಥ -ಥ◡ಥ -ಥ﹏ಥ -ಥ_ಥ -ಭ_ಭ -ರ_ರ -ಸ , ໖ -ಸ_ಸ -ക_ക -อ้_อ้ -อ_อ -โ๏௰๏ใ ื -๏̯͡๏﴿ -๏̯͡๏ -๏̯͡๏﴿ -๏[-ิิ_•ิ]๏ -๏_๏ -໖_໖ -ლ(´ڡ`ლ) -ლ(́◉◞౪◟◉‵ლ) -ლ(ಠ益ಠლ) -ლ(╹◡╹ლ) -ლ(◉◞౪◟◉‵ლ) -ლ,ᔑ•ﺪ͟͠•ᔐ.ლ -ᄽὁȍ ̪ őὀᄿ -ᕕ( ᐛ )ᕗ -ᕙ(⇀‸↼‶)ᕗ -ᕦ(ò_óˇ)ᕤ -ᶘ ᵒᴥᵒᶅ -‘︿’ -•▱• -•✞_✞• -•ﺑ• -•(⌚_⌚)• -•_•) -‷̗ↂ凸ↂ‴̖ -‹•.•› -‹› ‹(•¿•)› ‹› -‹(ᵒᴥᵒ­­­­­)› -‹(•¿•)› -ↁ_ↁ -⇎_⇎ -∩(︶▽︶)∩ -∩( ・ω・)∩ -≖‿≖ -≧ヮ≦ -⊂•⊃_⊂•⊃ -⊂⌒~⊃。Д。)⊃ -⊂(◉‿◉)つ -⊂(゚Д゚,,⊂⌒`つ -⊙ω⊙ -⊙▂⊙ -⊙▃⊙ -⊙△⊙ -⊙︿⊙ -⊙﹏⊙ -⊙0⊙ -⊛ठ̯⊛ -⋋ō_ō` -━━━ヽ(ヽ(゚ヽ(゚ヽ(゚゚ヽ(゚゚)ノ゚゚)ノ゚)ノ゚)ノ)ノ━━━ -┌∩┐(◕_◕)┌∩┐ -┌( ಠ_ಠ)┘ -┌( ಥ_ಥ)┘ -╚(•⌂•)╝ -╭╮╭╮☜{•̃̾_•̃̾}☞╭╮╭╮ -╭✬⌢✬╮ -╮(▽)╭ -╯‵Д′)╯彡┻━┻ -╰☆╮ -□_□ -►_◄ -◃┆◉◡◉┆▷ -◉△◉ -◉︵◉ -◉_◉ -○_○ -●¿●\ ~ -●_● -◔̯◔ -◔ᴗ◔ -◔ ⌣ ◔ -◔_◔ -◕ω◕ -◕‿◕ -◕◡◕ -◕ ◡ ◕ -◖♪_♪|◗ -◖|◔◡◉|◗ -◘_◘ -◙‿◙ -◜㍕◝ -◪_◪ -◮_◮ -☁ ☝ˆ~ˆ☂ -☆¸☆ -☉‿⊙ -☉_☉ -☐_☐ -☜ق❂Ⴢ❂ق☞ -☜(⌒▽⌒)☞ -☜(゚ヮ゚☜) -☜-(ΘLΘ)-☞ -☝☞✌ -☮▁▂▃▄☾ ♛ ◡ ♛ ☽▄▃▂▁☮ -☹_☹ -☻_☻ -☼.☼ -☾˙❀‿❀˙☽ -♀ح♀ヾ -♥‿♥ -♥╣[-_-]╠♥ -♥╭╮♥ -♥◡♥ -✌♫♪˙❤‿❤˙♫♪✌ -✌.ʕʘ‿ʘʔ.✌ -✌.|•͡˘‿•͡˘|.✌ -✖‿✖ -✖_✖ -❐‿❑ -_ -_Ꙩ -⨂_⨂ -〆(・・@) -《〠_〠》 -【•】_【•】 -〠_〠 -〴⋋_⋌〵 -の� �の -ニガー? ━━━━━━(゚゚)━━━━━━ ニガー? -ペ㍕˚\ -ヽ(´ー` )ノ -ヽ(๏๏ )ノ -ヽ(`Д´)ノ -ヽ(o`皿′o)ノ -ヽ(`Д´)ノ -ㅎ_ㅎ -乂◜◬◝乂 -凸ಠ益ಠ)凸 -句_句 -Ꙩ⌵Ꙩ -Ꙩ_Ꙩ -ꙩ_ꙩ -Ꙫ_Ꙫ -ꙫ_ꙫ -ꙮ_ꙮ -흫_흫 -句_句 -﴾͡๏̯͡๏﴿ O'RLY? -¯\(ºдಠ)/¯ -(·×·) -(⌒Д⌒) -(╹ェ╹) -(♯・・)⊃ -( ´`)☆ -( ´`) -(゜Д゜) -(・・) -(・A・) -(゚゚) -( ̄へ ̄) -( ´☣///_ゝ///☣`) -( つ Д `) -_☆( ´_⊃`)☆_ -。◕‿‿◕。 -。◕ ‿ ◕。 -!⑈ˆ~ˆ!⑈ -!(`・ω・。) -(¬‿¬) -(¬▂¬) -(¬_¬) -(°ℇ °) -(°°) -(´ω`) -(´◉◞౪◟◉) -(´ヘ`;) -(´・ω・`) -(´ー`) -(ʘ‿ʘ) -(ʘ_ʘ) -(˚இ˚) -(͡๏̯͡๏) -(ΘεΘ;) -(ι´Д`)ノ -(Ծ‸ Ծ) -(॓_॔) -(० ्०) -(ு८ு_ .:) -(ಠ‾ಠ) -(ಠ‿ʘ) -(ಠ‿ಠ) -(ಠ⌣ಠ) -(ಠ益ಠ ╬) -(ಠ益ಠ) -(ಠ_ృ) -(ಠ_ಠ) -(ಥ﹏ಥ) -(ಥ_ಥ) -(๏̯͡๏ ) -(ღ˘⌣˘ღ) ♫・*:.。. .。.:*・ -(ღ˘⌣˘ღ) -(ᵔᴥᵔ) -(•ω•) -(•‿•) -(•⊙ω⊙•) -(• ε •) -(∩▂∩) -(∩︵∩) -(∪ ◡ ∪) -(≧ω≦) -(≧◡≦) -(≧ロ≦) -(⊙ヮ⊙) -(⊙_◎) -(⋋▂⋌) -(⌐■_■) -(‿‿) -(┛◉Д◉)┛┻━┻ -(╥_╥) -(╬ಠ益ಠ) -(╬◣д◢) -(╬ ಠ益ಠ) -(╯°□°)╯︵ ┻━┻ -(╯ಊ╰) -(╯◕_◕)╯ -(╯︵╰,) -(╯3╰) -(╯_╰) -(╹◡╹)凸 -(▰˘◡˘▰) -(●´ω`●) -(●´`●) -(◑‿◐) -(◑◡◑) -(◕‿◕✿) -(◕‿◕) -(◕‿-) -(◕︵◕) -(◕ ^ ◕) -(◕_◕) -(◜௰◝) -(◡‿◡✿) -(◣_◢) -(☞゚゚)☞ -(☞゚ヮ゚)☞ -(☞゚ ゚ )☞ -(☼◡☼) -(☼_☼) -(✌゚゚)☞ -(✖╭╮✖) -(✪㉨✪) -(✿◠‿◠) -(✿ ♥‿♥) -( ・・) -( ・ัω・ั)? -( ゚゚)o彡゜えーりんえーりん!! -(。・_・。) -(つд`) -(づ。◕‿‿◕。)づ -(ノಠ益ಠ)ノ彡┻━┻ -(ノ ◑‿◑)ノ -(ノ_・。) -(・・ ) -(屮゚Д゚)屮 -(︶ω︶) -(︶︹︺) -(ﺧ益ﺨ) -(;一_一) -(`・ω・´)” -(。◕‿‿◕。) -(。◕‿◕。) -(。◕ ‿ ◕。) -(。♥‿♥。) -(。・ω..・)っ -(・ェ-) -(ノ◕ヮ◕)ノ*:・゚✧ -(゚Д゚) -(゚Д゚)y┛~~ -(゚゚) -(゚ヮ゚) -( ̄□ ̄) -( ̄。 ̄) -( ̄ー ̄) -( ̄(エ) ̄) -( °٢° ) -( ´_ゝ`) -( ͡° ͜ʖ ͡°) -( ͡~ ͜ʖ ͡°) -( ಠ◡ಠ ) -( •_•)>⌐■-■ -(  ゚,_ゝ゚) -( ・ิз・ิ) -( ゚д゚)、 -( ^▽^)σ)~O~) -((((゜д゜;)))) -(*´д`*) -(*..Д`) -(*..д`*) -(*~▽~) -(-’๏_๏’-) -(-_- )ノ -(/◔ ◡ ◔)/ -(///_ಥ) -(;´Д`) -(=ω=;) -(=゜ω゜) -(>'o')> ♥ <('o'<) -(n˘v˘•)¬ -(o´ω`o) -(V)(°,,°)(V) -(\/) (°,,°) (\/) -(^▽^) -(`・ω・´) -(~ ̄▽ ̄)~ -/╲/\╭ºoꍘoº╮/\╱\ -<【☯】‿【☯】> -= (゚д゚)ウ -@_@ -d(*⌒▽⌒*)b -o(≧≦)o -o(≧o≦)o -q(❂‿❂)p -y=ー( ゚д゚)・∵. -\˚ㄥ˚\ -\ᇂ_ᇂ\ -\(ಠ ὡ ಠ )/ -\(◕ ◡ ◕\) -^̮^ -^ㅂ^ -_(͡๏̯͡๏)_ -{´◕ ◡ ◕`} -{ಠ_ಠ}__,,|, -{◕ ◡ ◕} diff --git a/hydra_core__standalone/hydra_core__standalone/databases/maple_db.json b/hydra_core__standalone/hydra_core__standalone/databases/maple_db.json deleted file mode 100644 index 9e26dfe..0000000 --- a/hydra_core__standalone/hydra_core__standalone/databases/maple_db.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/hydra_core__standalone/hydra_core__standalone/maple.ini b/hydra_core__standalone/hydra_core__standalone/maple.ini deleted file mode 100644 index 35455bb..0000000 --- a/hydra_core__standalone/hydra_core__standalone/maple.ini +++ /dev/null @@ -1,30 +0,0 @@ -[bot] -nick = maple -username = g1mp -realname = "[ g1mp'n ain't easy unless you're maple ]" -host = ircd.chat -port = 6697 -version = 1 -url = ircd.chat -ssl = true -ssl_verify = CERT_NONE - -includes = - irc3.plugins.log - irc3.plugins.logger - plugins.command_plugin - plugins.storage_plugin - plugins.fifo_plugin - plugins.sasl_custom_plugin - plugins.net_hydra_plugin - -autojoins = - ${#}PalletTown - -flood_burst = 0 -flood_rate = 1 -flood_rate_delay = 1 -storage = json://databases/maple_db.json - -[plugins.fifo_plugin] -runpath = .fifo diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/command_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/command_plugin.py deleted file mode 100644 index e5f974d..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/command_plugin.py +++ /dev/null @@ -1,528 +0,0 @@ -# -*- coding: utf-8 -*- -from irc3.compat import asyncio -from irc3 import utils -from collections import defaultdict -import functools -import venusian -import fnmatch -import logging -import docopt -import shlex -import irc3 -import sys -import re -__doc__ = ''' -========================================== -:mod:`irc3.plugins.command` Command plugin -========================================== - -Introduce a ``@command`` decorator - -The decorator use `docopts `_ to parse command arguments. - -Usage -===== - -Create a python module with some commands: - -.. literalinclude:: ../../examples/mycommands.py - -.. - >>> import sys - >>> sys.path.append('examples') - >>> from irc3.testing import IrcBot - >>> from irc3.testing import ini2config - -And register it:: - - >>> bot = IrcBot() - >>> bot.include('irc3.plugins.command') # register the plugin - >>> bot.include('mycommands') # register your commands - - -Check the result:: - - >>> bot.test(':gawel!user@host PRIVMSG #chan :!echo foo') - PRIVMSG #chan :foo - -In the docstring, ``%%`` is replaced by the command character. ``!`` by -default. You can override it by passing a ``cmd`` parameter to bot's config. - -When a command is not public, you can't use it on a channel:: - - >>> bot.test(':gawel!user@host PRIVMSG #chan :!adduser foo pass') - PRIVMSG gawel :You can only use the 'adduser' command in private. - -If a command is tagged with ``show_in_help_list=False``, it won't be shown -on the result of ``!help``. - - >>> bot.test(':gawel!user@host PRIVMSG #chan :!help') - PRIVMSG #chan :Available commands: !adduser, !echo, !help - -View extra info about a command by specifying it to ``!help``. - - >>> bot.test(':gawel!user@host PRIVMSG #chan :!help echo') - PRIVMSG #chan :Echo command - PRIVMSG #chan :!echo ... - >>> bot.test(':gawel!user@host PRIVMSG #chan :!help nonexistant') - PRIVMSG #chan :No such command. Try !help for an overview of all commands. - -Guard -===== - -You can use a guard to prevent untrusted users to run some commands. The -:class:`free_policy` is used by default. - -There is two builtin policy: - -.. autoclass:: free_policy - - -.. autoclass:: mask_based_policy - -Mask based guard using permissions:: - - >>> config = ini2config(""" - ... [bot] - ... nick = nono - ... includes = - ... irc3.plugins.command - ... mycommands - ... [irc3.plugins.command] - ... guard = irc3.plugins.command.mask_based_policy - ... [irc3.plugins.command.masks] - ... gawel!*@* = all_permissions - ... foo!*@* = help - ... """) - >>> bot = IrcBot(**config) - -foo is allowed to use command without permissions:: - - >>> bot.test(':foo!u@h PRIVMSG nono :!echo got the power') - PRIVMSG foo :got the power - -foo is not allowed to use command except those with the help permission:: - - >>> bot.test(':foo!u@h PRIVMSG nono :!ping') - PRIVMSG foo :You are not allowed to use the 'ping' command - -gawel is allowed:: - - >>> bot.test(':gawel!u@h PRIVMSG nono :!ping') - NOTICE gawel :PONG gawel! - -Async commands -============== - -Commands can be coroutines: - -.. literalinclude:: ../../examples/async_command.py - :language: py - -Available options -================= - -The plugin accept the folowing options: - -.. code-block:: ini - - [irc3.plugins.command] - cmd = ! - use_shlex = true - antiflood = true - casesensitive = true - guard = irc3.plugins.command.mask_based_policy - - -Command arguments -================= - -The :func:`command` decorator accept the folowing arguments: - -**name**: if set, use this name as the command name instead of the function -name. - -**permission**: if set, this permission will be required to run the command. -See Guard section - -**use_shlex**: if `False`, do not use `shlex` to parse command line. - -**options_first**: if `True` use docopt's options_first options. Allow to have -args that starts with `-` as arguments. - -**error_format**: allow to customize error messages. must be a callable that -accept keyword arguments `cmd`, `args` and `exc`. -For example, `error_format="Error for {cmd}".format` will work. - -**quiet**: if `True` don't show errors - -**aliases**: this argument, when present, should be a list of strings. All -those strings will become alternative command names (i.e. aliases). -For example, command 'mycmd' with aliases=['theircmd', 'noonescmd'] could -be called via all three names. - - -''' - - -class free_policy: - """Default policy""" - def __init__(self, bot): - self.context = bot - - def __call__(self, predicates, meth, client, target, args, **kwargs): - return meth(client, target, args) - - -class mask_based_policy: - """Allow only valid masks. Able to take care or permissions""" - - key = __name__ + '.masks' - - def __init__(self, bot): - self.context = bot - self.log = logging.getLogger(__name__) - self.log.debug('Masks: %r', self.masks) - - @property - def masks(self): - masks = self.context.config[self.key] - if hasattr(self.context, 'db'): - # update config with storage values - try: - value = self.context.db[self] - except KeyError: - pass - else: - if isinstance(value, dict): - masks.update(value) - return masks - - def has_permission(self, mask, permission): - if permission is None: - return True - for pattern in self.masks: - if fnmatch.fnmatch(mask, pattern): - if not isinstance(self.masks, dict): - return True - perms = self.masks[pattern] - if permission in perms or 'all_permissions' in perms: - return True - return False - - def __call__(self, predicates, meth, client, target, args, **kwargs): - if self.has_permission(client, predicates.get('permission')): - return meth(client, target, args) - cmd_name = predicates.get('name', meth.__name__) - self.context.privmsg( - client.nick, - 'You are not allowed to use the %r command' % cmd_name) - - -def attach_command(func, depth=2, **predicates): - commands = predicates.pop('commands', - 'irc3.plugins.command.Commands') - category = predicates.pop('venusian_category', - 'irc3.plugins.command') - - def callback(context, name, ob): - obj = context.context - if info.scope == 'class': - callback = func.__get__(obj.get_plugin(ob), ob) - else: - callback = utils.wraps_with_context(func, obj) - plugin = obj.get_plugin(utils.maybedotted(commands)) - predicates.update(module=func.__module__) - cmd_name = predicates.get('name', func.__name__) - if not plugin.case_sensitive: - cmd_name = cmd_name.lower() - plugin[cmd_name] = (predicates, callback) - aliases = predicates.get('aliases', None) - if aliases is not None: - for alias in aliases: - plugin.aliases[alias] = cmd_name - obj.log.debug('Register command %r %r', cmd_name, aliases) - else: - obj.log.debug('Register command %r', cmd_name) - info = venusian.attach(func, callback, - category=category, depth=depth) - - -def command(*func, **predicates): - if func: - func = func[0] - attach_command(func, **predicates) - return func - else: - def wrapper(func): - attach_command(func, **predicates) - return func - return wrapper - - -@irc3.plugin -class Commands(dict): - - __reloadable__ = False - - requires = [ - __name__.replace('command', 'core'), - ] - default_policy = free_policy - case_sensitive = False - - def __init__(self, context): - self.context = context - module = self.__class__.__module__ - self.config = config = context.config.get(module, {}) - self.log = logging.getLogger(module) - self.log.debug('Config: %r', config) - - if 'cmd' in context.config: # in case of - config['cmd'] = context.config['cmd'] - context.config['cmd'] = self.cmd = config.get('cmd', '!') - context.config['re_cmd'] = re.escape(self.cmd) - - self.use_shlex = self.config.get('use_shlex', True) - self.antiflood = self.config.get('antiflood', False) - self.case_sensitive = self.config.get('casesensitive', - self.case_sensitive) - - guard = utils.maybedotted(config.get('guard', self.default_policy)) - self.log.debug('Guard: %s', guard.__name__) - self.guard = guard(context) - - self.error_format = utils.maybedotted(config.get('error_format', - "Invalid arguments.".format)) - self.handles = defaultdict(Done) - self.tasks = defaultdict(Done) - - self.aliases = {} - - def split_command(self, data, use_shlex=None): - if not data: - return [] - return shlex.split(data) if use_shlex else data.split(' ') - - @irc3.event((r'(@(?P\S+) )?:(?P\S+) PRIVMSG (?P\S+) ' - r':{re_cmd}(?P[\w-]+)(\s+(?P\S.*)|(\s*$))')) - def on_command(self, cmd, mask=None, target=None, client=None, **kw): - if not self.case_sensitive: - cmd = cmd.lower() - cmd = self.aliases.get(cmd, cmd) - predicates, meth = self.get(cmd, (None, None)) - if meth is not None: - if predicates.get('public', True) is False and target.is_channel: - self.context.privmsg( - mask.nick, - 'You can only use the %r command in private.' % str(cmd)) - else: - return self.do_command(predicates, meth, mask, target, **kw) - - def do_command(self, predicates, meth, client, target, data=None, **kw): - nick = self.context.nick or '-' - to = client.nick if target == nick else target - doc = meth.__doc__ or '' - doc = [line.strip() for line in doc.strip().split('\n')] - doc = [nick + ' ' + line.strip('%%') - for line in doc if line.startswith('%%')] - doc = 'Usage:' + '\n ' + '\n '.join(doc) - if data: - if not isinstance(data, str): # pragma: no cover - encoding = self.context.encoding - data = data.encode(encoding) - try: - data = self.split_command( - data, use_shlex=predicates.get('use_shlex', self.use_shlex)) - except ValueError as e: - if not predicates.get('quiet', False): - self.context.privmsg(to, 'Invalid arguments: {}.'.format(e)) - return - docopt_args = dict(help=False) - if "options_first" in predicates: - docopt_args.update(options_first=predicates["options_first"]) - cmd_name = predicates.get('name', meth.__name__) - try: - args = docopt.docopt(doc, [cmd_name] + data, **docopt_args) - except docopt.DocoptExit as exc: - if not predicates.get('quiet', False): - args = {'cmd': cmd_name, 'args': data, - 'args_str': " ".join(data), 'exc': exc} - error_format = predicates.get('error_format', - self.error_format) - self.context.privmsg(to, error_format(**args)) - else: - uid = (cmd_name, to) - use_client = isinstance(client, asyncio.Protocol) - if not self.tasks[uid].done(): - self.context.notice( - client if use_client else client.nick, - "Another task is already running. " - "Please be patient and don't flood me", nowait=True) - elif not self.handles[uid].done() and self.antiflood: - self.context.notice( - client if use_client else client.nick, - "Please be patient and don't flood me", nowait=True) - else: - # get command result - res = self.guard(predicates, meth, client, target, args=args) - - callback = functools.partial(self.command_callback, uid, to) - if res is not None: - coros = ( - asyncio.iscoroutinefunction(meth), - asyncio.iscoroutinefunction(self.guard.__call__) - ) - if any(coros): - task = asyncio.ensure_future( - res, loop=self.context.loop) - # use a callback if command is a coroutine - task.add_done_callback(callback) - self.tasks[uid] = task - return task - else: - # no callback needed - callback(res) - - def command_callback(self, uid, to, msgs): - if isinstance(msgs, asyncio.Future): # pragma: no cover - msgs = msgs.result() - if msgs is not None: - def iterator(msgs): - for msg in msgs: - yield to, msg - if isinstance(msgs, str): - msgs = [msgs] - handle = self.context.call_many('privmsg', iterator(msgs)) - if handle is not None: - self.handles[uid] = handle - - @command - def help(self, mask, target, args): - """Show help - - %%help [] - """ - return "not today stan" - if args['']: - args = args[''] - # Strip out self.context.config.cmd from args so we can use - # both !help !foo and !help foo - if args.startswith(self.context.config.cmd): - args = args[len(self.context.config.cmd):] - args = self.aliases.get(args, args) - predicates, meth = self.get(args, (None, None)) - if meth is not None: - doc = meth.__doc__ or '' - doc = [ - line.strip() for line in doc.split('\n') - if line.strip() - ] - buf = '' - for line in doc: - if '%%' not in line and buf is not None: - buf += line + ' ' - else: - if buf is not None: - for b in utils.split_message(buf, 160): - yield b - buf = None - line = line.replace('%%', self.context.config.cmd) - yield line - aliases = predicates.get('aliases', None) - if aliases is not None: - yield 'Aliases: {0}'.format(','.join(sorted(aliases))) - else: - yield ('No such command. Try %shelp for an ' - 'overview of all commands.' - % self.context.config.cmd) - else: - cmds = sorted((k for (k, (p, m)) in self.items() - if p.get('show_in_help_list', True))) - cmds_str = ', '.join([self.cmd + k for k in cmds]) - lines = utils.split_message( - 'Available commands: %s ' % cmds_str, 160) - for line in lines: - yield line - url = self.config.get('url') - if url: - yield 'Full help is available at ' + url - - def __repr__(self): - return '' % sorted([self.cmd + k for k in self.keys()]) - - -class Done: - - def done(self): - return True - - -@command(permission='admin', show_in_help_list=False, public=False) -def ping(bot, mask, target, args): - """ping/pong - - %%ping - """ - bot.send('NOTICE %(nick)s :PONG %(nick)s!' % dict(nick=mask.nick)) - - -@command(venusian_category='irc3.debug', show_in_help_list=False) -def quote(bot, mask, target, args): - """send quote to the server - - %%quote ... - """ - msg = ' '.join(args['']) - bot.log.info('quote> %r', msg) - bot.send(msg) - - -@command(venusian_category='irc3.debug', show_in_help_list=False) -def reconnect(bot, mask, target, args): - """force reconnect - - %%reconnect - """ - plugin = bot.get_plugin(utils.maybedotted('irc3.plugins.core.Core')) - bot.loop.call_soon(plugin.reconnect) - - -@irc3.extend -def print_help_page(bot, file=sys.stdout): - """print help page""" - def p(text): - print(text, file=file) - plugin = bot.get_plugin(Commands) - title = "Available Commands for {nick} at {host}".format(**bot.config) - p("=" * len(title)) - p(title) - p("=" * len(title)) - p('') - p('.. contents::') - p('') - modules = {} - for name, (predicates, callback) in plugin.items(): - commands = modules.setdefault(callback.__module__, []) - commands.append((name, callback, predicates)) - - for module in sorted(modules): - p(module) - p('=' * len(module)) - p('') - for name, callback, predicates in sorted(modules[module]): - p(name) - p('-' * len(name)) - p('') - doc = callback.__doc__ - doc = doc.replace('%%', bot.config.cmd) - for line in doc.split('\n'): - line = line.strip() - if line.startswith(bot.config.cmd): - line = ' ``{}``'.format(line) - p(line) - if 'permission' in predicates: - p('*Require {0[permission]} permission.*'.format(predicates)) - if predicates.get('public', True) is False: - p('*Only available in private.*') - p('') diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/core_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/core_plugin.py deleted file mode 100644 index 585666a..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/core_plugin.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -from irc3 import event -from irc3 import rfc -__doc__ = ''' -============================================== -:mod:`irc3.plugins.core` Core plugin -============================================== - -Core events - -.. autoclass:: Core - :members: - -.. - >>> from irc3.testing import IrcBot - -Usage:: - - >>> bot = IrcBot() - >>> bot.include('irc3.plugins.core') -''' - - -class Core: - - def __init__(self, bot): - self.bot = bot - self.timeout = int(self.bot.config.get('timeout')) - self.max_lag = int(self.bot.config.get('max_lag')) - self.reconn_handle = None - self.ping_handle = None - self.nick_handle = None - self.before_connect_events = [ - event(rfc.CONNECTED, self.connected), - event(r"^:\S+ 005 \S+ (?P.+) :\S+.*", - self.set_config), - ] - - def connection_made(self, client=None): - # handle server config - config = self.bot.defaults['server_config'].copy() - self.bot.config['server_config'] = config - self.bot.detach_events(*self.before_connect_events) - self.bot.attach_events(insert=True, *self.before_connect_events) - - # ping/ping - self.connection_made_at = self.bot.loop.time() - self.pong(event='CONNECT', data='') - - def connected(self, **kwargs): - """triger the server_ready event""" - self.bot.log.info('Server config: %r', self.bot.server_config) - - # recompile when I'm sure of my nickname - self.bot.config['nick'] = kwargs['me'] - self.bot.recompile() - - # Let all plugins know that server can handle commands - self.bot.notify('server_ready') - - # detach useless events - self.bot.detach_events(*self.before_connect_events) - - def reconnect(self): # pragma: no cover - self.bot.log.info( - "We're waiting a ping for too long. Trying to reconnect...") - self.bot.loop.call_soon( - self.bot.protocol.connection_lost, - 'No pong reply' - ) - self.pong(event='RECONNECT', data='') - - @event(rfc.PONG) - def pong(self, event='PONG', data='', **kw): # pragma: no cover - """P0NG/PING""" - self.bot.log.debug('%s ping-pong (%s)', event, data) - if self.reconn_handle is not None: - self.reconn_handle.cancel() - self.reconn_handle = self.bot.loop.call_later(self.timeout, - self.reconnect) - if self.ping_handle is not None: - self.ping_handle.cancel() - self.ping_handle = self.bot.loop.call_later( - self.timeout - self.max_lag, self.bot.send, - 'PING :%s' % int(self.bot.loop.time())) - - @event(rfc.PING) - def ping(self, data): - """PING reply""" - self.bot.send('PONG :' + data) - self.pong(event='PING', data=data) - - @event(rfc.NEW_NICK) - def recompile(self, nick=None, new_nick=None, **kw): - """recompile regexp on new nick""" - if self.bot.nick == nick.nick: - self.bot.config['nick'] = new_nick - self.bot.recompile() - - @event(rfc.ERR_NICK) - def badnick(self, me=None, nick=None, **kw): - """Use alt nick on nick error""" - if me == '*': - self.bot.set_nick(self.bot.nick + '_') - self.bot.log.debug('Trying to regain nickname in 30s...') - self.nick_handle = self.bot.loop.call_later( - 30, self.bot.set_nick, self.bot.original_nick) - - def set_config(self, data=None, **kwargs): - """Store server config""" - config = self.bot.config['server_config'] - for opt in data.split(' '): - if '=' in opt: - opt, value = opt.split('=', 1) - else: - value = True - if opt.isupper(): - config[opt] = value diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/fifo_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/fifo_plugin.py deleted file mode 100644 index 37b1ad3..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/fifo_plugin.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- ############################################################### SOF -import os -import irc3 -from stat import S_ISFIFO -########################################################################################### -@irc3.plugin -class Fifo: - ####################################################################################### - BLOCK_SIZE = 1024 - MAX_BUFFER_SIZE = 800 - ####################################################################################### - def __init__(self, context): - self.context = context - self.config = self.context.config - self.send_blank_line = self.config.get('send_blank_line', True) - self.runpath = self.config.get('runpath', f'{os.getcwd()}/fifo') - if not os.path.exists(self.runpath): - os.makedirs(self.runpath) - self.loop = self.context.loop - self.fifos = {} - self.buffers = {} - self.create_fifo(None) - ####################################################################################### - @classmethod - def read_fd(cls, fd): - while True: - try: - return os.read(fd, cls.BLOCK_SIZE) - except InterruptedError: - continue - except BlockingIOError: - return b"" - ####################################################################################### - def handle_line(self, line, channel): - if not line: - return - line = line.decode("utf8") - if not self.send_blank_line and not line.strip(): - return - if channel is None: - self.context.send_line(line) - else: - self.context.privmsg(channel, line) - ####################################################################################### - def data_received(self, data, channel): - if not data: - return - prev = self.buffers.get(channel, b"") - lines = (prev + data).splitlines(True) - last = lines[-1] - for line in lines[:-1]: - line = line.rstrip(b'\r\n') - self.handle_line(line, channel) - if last.endswith(b'\n'): - line = last.rstrip(b'\r\n') - self.handle_line(line, channel) - self.buffers[channel] = b"" - return - if len(last) > self.MAX_BUFFER_SIZE: - self.handle_line(last, channel) - self.buffers[channel] = b"" - else: - self.buffers[channel] = last - ####################################################################################### - def watch_fd(self, fd, channel): - reading = True - - while reading: - data = self.read_fd(fd) - reading = len(data) == self.BLOCK_SIZE - self.data_received(data, channel) - ####################################################################################### - def create_fifo(self, channel): - if channel is None: - path = os.path.join(self.runpath, ':raw') - else: - path = os.path.join(self.runpath, channel.strip('#&+')) - try: - mode = os.stat(path).st_mode - except OSError: - pass - else: - if not S_ISFIFO(mode): - self.context.log.warn( - 'file %s created without mkfifo. remove it', - path) - os.remove(path) - if not os.path.exists(path): - os.mkfifo(path) - fd = os.open(path, os.O_RDWR | os.O_NONBLOCK) - self.loop.add_reader(fd, self.watch_fd, fd, channel) - self.context.log.debug("%s's fifo is %s %r", - channel or ':raw', path, fd) - return fd - ####################################################################################### - @irc3.event(irc3.rfc.JOIN) - def join(self, mask=None, channel=None, **kwargs): - if mask.nick == self.context.nick: - if channel not in self.fifos: - self.fifos[channel] = self.create_fifo(channel) -####################################################################################### EOF diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/net_hydra_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/net_hydra_plugin.py deleted file mode 100644 index 04239cf..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/net_hydra_plugin.py +++ /dev/null @@ -1,176 +0,0 @@ -# -*- 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 -########################################################################################### -class dr1p: - def __init__(): - dr1p.designation="" - dr1p.enforcing=False - dr1p.purpose="" - dr1p.color="" - dr1p.keyid="" - dr1p.token="" - dr1p.home="" -########################################################################################### -@irc3.plugin -class Plugin: - ####################################################################################### - def __init__(self,bot): - self.bot=bot - try: - dr1p.purpose=os.environ['HYDRA_PURPOSE'] - dr1p.designation=os.environ['HYDRA_DESIGNATION'] - dr1p.home=os.environ['HYDRA_HOME'] - dr1p.enforcing=False - except: - dr1p.designation="dupe" - dr1p.enforcing=False - return - if dr1p.designation=="core": dr1p.color="\x0304" - dr1p.keyid=self.hydra_id(1) - dr1p.token=self.hydra_id(0) - ####################################################################################### - def hydra_id(self,mode=1): - # from datetime import datetime - # from random import randint as rint - # from random import shuffle - hydra="" - for i in range(7): hydra+=hex(rint(0,255))[2:].zfill(2).upper() - hydra+=hex(int(datetime.now().timestamp()))[-4:].upper() - hydra=list(hydra) - shuffle(hydra) - if mode: - hydra=''.join(hydra) - self.keyid=hydra - else: - hydra=''.join(hydra)[6:14] - self.token=hydra - return hydra - ####################################################################################### - def server_ready(self): - if not dr1p.designation=='core': - self.token - self.bot.privmsg("maple",f"[hydra:{dr1p.keyid}] - 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 dr1p.designation=='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 dr1p.designation=='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 dr1p.designation=='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 dr1p.designation=='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 dr1p.designation=='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 dr1p.enforcing==False: return - 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 dr1p.designation=='core': - if data.endswith('dupe - connected'): - _keyid=data.split("[hydra:")[1].split("]")[0] - _diyek=_keyid[::-1] - msg=f'[KEYID:{_keyid}] - [DIYEK:{_diyek}] - 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 dr1p.designation=='dupe': - if not data.find('DIYEK')==-1: - _keyid=data.split(":")[1].split("]")[0] - if _keyid.lower()==dr1p.keyid.lower(): - if not data.find("] - [DIYEK:")==-1: - _diyek=data.split("] - [DIYEK:")[1].split("]")[0] - if _keyid.lower()==_diyek[::-1].lower(): - _color=int(data.split(" - COLOR:")[1].strip()) - if not dr1p.color: - dr1p.color=f"\x03{str(_color)}" - if dr1p.designation=='core': - msg=f"{dr1p.color}[maple:{dr1p.keyid}] - " - else: - _keyid=data.split("[hydra:")[1].split("]")[0] - if self.keyid==_keyid: - try: - msg=f"{dr1p.color}[hydra:{dr1p.keyid}] - " - except: - dr1p.color="\x0303" - msg=f"{dr1p.color}[hydra:{dr1p.keyid}] - " - _keyid=data.split("[hydra:")[1].split("]")[0] - if self.keyid==_keyid: - if mask.nick!=self.bot.config['nick']: - if target!=dr1p.home: return - if target==dr1p.home: return - msg+=f'event:{event} - mask:{mask} - target:{target} - data:' - msg+=f'{data}' - if kw: msg+=f" - kw:{kw}" - self.bot.privmsg(dr1p.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!=dr1p.home: - if dr1p.enforcing: - reason=".[d]." - self.bot.part(target,reason) - self.bot.privmsg("maple",f"parted {target} - {reason}".lower()) - if dr1p.designation=="core": - msg=f"[maple:{dr1p.keyid}] - core - maple online - test purpose: {dr1p.purpose}" - self.bot.privmsg(dr1p.home,msg) - else: - msg=f"[hydra:{dr1p.keyid}] - dupe - hydra online - test purpose: {dr1p.purpose}" - self.bot.privmsg(dr1p.home,msg) - if kw['event']=='PART': - if dr1p.designation=="core": - msg=f"[maple:{dr1p.keyid}] -" - else: - msg=f"[hydra:{dr1p.keyid}] -" - self.bot.privmsg("maple",msg+f"parted {target} - {data}") - if kw['event']=='QUIT': - if dr1p.designation=="core": - msg=f"[maple:{dr1p.keyid}] -" - else: - msg=f"[hydra:{dr1p.keyid}] -" - self.bot.privmsg("maple",msg+f"quit {target} - {data}") -####################################################################################### EOF \ No newline at end of file diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/sasl_custom_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/sasl_custom_plugin.py deleted file mode 100644 index efd682f..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/sasl_custom_plugin.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- ########################################################## SOF -import irc3, os, base64 -###################################################################################### -BOT_SASL_USERNAME=os.environ['BOT_SASL_USERNAME'] -BOT_SASL_PASSWORD=os.environ['BOT_SASL_PASSWORD'] -###################################################################################### -@irc3.plugin -class DR1PSASL: - ################################################################################## - def __init__(self, bot): - print('<<< _sasl_custom_plugin >>> [ custom sasl initiated ]') - self.bot=bot - self.auth=(f'{BOT_SASL_USERNAME}\0{BOT_SASL_USERNAME}\0{BOT_SASL_PASSWORD}') - self.auth=base64.encodebytes(self.auth.encode('utf8')) - self.auth=self.auth.decode('utf8').rstrip('\n') - self.events = [ - irc3.event(r'^:\S+ CAP \S+ LS :(?P.*)', self.cap_ls), - irc3.event(r'^:\S+ CAP \S+ ACK sasl', self.cap_ack), - irc3.event(r'AUTHENTICATE +', self.authenticate), - irc3.event(r'^:\S+ 903 \S+ :Authentication successful',self.cap_end), - ] - ################################################################################## - def connection_ready(self, *args, **kwargs): - print('<<< _sasl_custom_plugin >>> [ CAP LS ]') - self.bot.send('CAP LS\r\n') - self.bot.attach_events(*self.events) - ################################################################################## - def cap_ls(self, data=None, **kwargs): - print('<<< _sasl_custom_plugin >>> [ CAP REQ :sasl ]') - if 'sasl' in data.lower(): - self.bot.send_line('CAP REQ :sasl') - else: - self.cap_end() - ################################################################################## - def cap_ack(self, **kwargs): - print('<<< _sasl_custom_plugin >>> [ AUTHENTICATE PLAIN ]') - self.bot.send_line('AUTHENTICATE PLAIN') - ################################################################################## - def authenticate(self, **kwargs): - print(f'<<< _sasl_custom_plugin >>> [ AUTHENTICATE {self.auth} ]') - self.bot.send_line(f'AUTHENTICATE {self.auth}\n') - ################################################################################## - def cap_end(self, **kwargs): - print('<<< _sasl_custom_plugin >>> [ CAP END ]') - self.bot.send_line('CAP END\r\n') - self.bot.detach_events(*self.events) - ################################################################################## -################################################################################## EOF diff --git a/hydra_core__standalone/hydra_core__standalone/plugins/storage_plugin.py b/hydra_core__standalone/hydra_core__standalone/plugins/storage_plugin.py deleted file mode 100644 index d8631a9..0000000 --- a/hydra_core__standalone/hydra_core__standalone/plugins/storage_plugin.py +++ /dev/null @@ -1,293 +0,0 @@ -# -*- coding: utf-8 -*- ############################################################### SOF -import os -try: - import ujson as json -except ImportError: - import json -import irc3 -import shelve -########################################################################################### -class Shelve: - ####################################################################################### - def __init__(self, uri=None, **kwargs): - self.filename = uri[9:] - self.db = shelve.open(self.filename) - ####################################################################################### - def set(self, key, value): - self.db[key] = value - self.db.sync() - ####################################################################################### - def get(self, key): - return self.db[key] - ####################################################################################### - def delete(self, key): - del self.db[key] - self.sync() - ####################################################################################### - def contains(self, key): - return key in self.db - ####################################################################################### - def sync(self): - self.db.sync() - ####################################################################################### - def close(self): - self.db.close() -########################################################################################### -class JSON: - def __init__(self, uri=None, **kwargs): - self.filename = uri[7:] - if os.path.isfile(self.filename): # pragma: no cover - with open(self.filename) as fd: - self.db = json.load(fd) - else: - self.db = {} - ####################################################################################### - def set(self, key, value): - self.db[key] = value - self.sync() - ####################################################################################### - def get(self, key): - return self.db[key] - ####################################################################################### - def delete(self, key): - del self.db[key] - self.sync() - ####################################################################################### - def contains(self, key): - return key in self.db - ####################################################################################### - def sync(self): - with open(self.filename, 'w') as fd: - json.dump(self.db, fd, indent=2, sort_keys=True) - ####################################################################################### - def close(self): - self.sync() -########################################################################################### -class Redis: - def __init__(self, uri=None, **kwargs): - ConnectionPool = irc3.utils.maybedotted( - 'redis.connection.ConnectionPool') - pool = ConnectionPool.from_url(uri) - StrictRedis = irc3.utils.maybedotted('redis.client.StrictRedis') - self.db = StrictRedis(connection_pool=pool) - ####################################################################################### - def set(self, key, value): - self.db.hmset(key, value) - ####################################################################################### - def get(self, key): - keys = self.db.hkeys(key) - if not keys: - raise KeyError() - values = self.db.hmget(key, keys) - keys = [k.decode('utf8') for k in keys] - values = [v.decode('utf8') for v in values] - values = dict(zip(keys, values)) - return values - ####################################################################################### - def delete(self, key): - self.db.delete(key) - ####################################################################################### - def contains(self, key): - return self.db.exists(key) - ####################################################################################### - def flushdb(self): - self.db.flushdb() - ####################################################################################### - def sync(self): - self.db.save() - ####################################################################################### - def close(self): - self.sync() -########################################################################################### -class SQLite: - CREATE_TABLE = """ - CREATE TABLE IF NOT EXISTS - irc3_storage ( - key text not null, - value text default '', - PRIMARY KEY (key) - ); - """ - UPSERT = """ - INSERT OR REPLACE INTO irc3_storage(key,value) VALUES(?, ?); - """ - ####################################################################################### - def __init__(self, uri=None, **kwargs): - self.sqlite = irc3.utils.maybedotted('sqlite3') - self.uri = uri.split('://')[-1] - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute(self.CREATE_TABLE) - conn.commit() - conn.close() - ####################################################################################### - def set(self, key, value): - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute(self.UPSERT, (key, json.dumps(value))) - cursor.fetchall() - conn.commit() - conn.close() - ####################################################################################### - def get(self, key): - value = None - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute("SELECT value FROM irc3_storage where key=?;", (key,)) - for row in cursor.fetchall(): - value = json.loads(row[0]) - break - cursor.close() - conn.close() - if value is None: - raise KeyError(key) - return value - ####################################################################################### - def delete(self, key): - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute("DELETE FROM irc3_storage where key=?;", (key,)) - cursor.close() - conn.commit() - conn.close() - ####################################################################################### - def contains(self, key): - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute("SELECT value FROM irc3_storage where key=?;", (key,)) - res = False - if len(list(cursor.fetchall())) == 1: - res = True - cursor.close() - conn.close() - return res - ####################################################################################### - def flushdb(self): - conn = self.sqlite.connect(self.uri) - cursor = conn.cursor() - cursor.execute("DROP TABLE IF EXISTS irc3_storage;") - cursor.execute(self.CREATE_TABLE) - cursor.close() - conn.commit() - conn.close() - ####################################################################################### - def sync(self): - pass - ####################################################################################### - def close(self): - pass -########################################################################################### -@irc3.plugin -class Storage: - backends = { - 'shelve': Shelve, - 'json': JSON, - 'unix': Redis, - 'redis': Redis, - 'rediss': Redis, - 'sqlite': SQLite, - } - ####################################################################################### - def __init__(self, context): - uri = context.config.storage - name = uri.split('://', 1)[0] - try: - factory = self.backends[name] - except KeyError: # pragma: no cover - raise LookupError('No such backend %s' % name) - self.backend = factory(uri) - self.context = context - self.context.db = self - ####################################################################################### - def setdefault(self, key_, **kwargs): - """Update storage value for key with kwargs iif the keys doesn't - exist. Return stored values""" - stored = self[key_] - changed = False - for k, v in kwargs.items(): - if k not in stored: - stored[k] = v - changed = True - else: - kwargs[k] = stored[k] - if changed: - self[key_] = stored - return kwargs - ####################################################################################### - def get(self, key_, default=None): - """Get storage value for key or return default""" - if key_ not in self: - return default - else: - return self[key_] - ####################################################################################### - def getlist(self, key_, default=None): - """Get storage value (as list) for key or return default""" - if key_ not in self: - return default - else: - value = self[key_] - value = [(int(i), v) for i, v in value.items()] - return [v for k, v in sorted(value)] - ####################################################################################### - def set(self, key_, **kwargs): - """Update storage value for key with kwargs""" - stored = self.get(key_, dict()) - changed = False - for k, v in kwargs.items(): - if k not in stored or stored[k] != v: - stored[k] = v - changed = True - if changed: - self[key_] = stored - ####################################################################################### - def setlist(self, key_, value): - """Update storage value (as list)""" - value = dict([(str(i), v) for i, v in enumerate(value)]) - if key_ in self: - del self[key_] - self.set(key_, **value) - ####################################################################################### - def __setitem__(self, key, value): - """Set storage value for key""" - key = getattr(key, '__module__', key) - if not isinstance(value, dict): # pragma: no cover - raise TypeError('value must be a dict') - try: - return self.backend.set(key, value) - except Exception as e: # pragma: no cover - self.context.log.exception(e) - raise - ####################################################################################### - def __getitem__(self, key): - """Get storage value for key""" - key = getattr(key, '__module__', key) - try: - return self.backend.get(key) - except KeyError: - raise KeyError(key) - except Exception as e: # pragma: no cover - self.context.log.exception(e) - raise - ####################################################################################### - def __delitem__(self, key): - """Delete key in storage""" - key = getattr(key, '__module__', key) - try: - self.backend.delete(key) - except Exception as e: # pragma: no cover - self.context.log.exception(e) - raise - ####################################################################################### - def __contains__(self, key): - """Return True if storage contains key""" - key = getattr(key, '__module__', key) - try: - return self.backend.contains(key) - except Exception as e: # pragma: no cover - self.context.log.exception(e) - raise - ####################################################################################### - def SIGINT(self): - self.backend.close() -####################################################################################### EOF diff --git a/hydra_core__standalone/hydra_core__standalone/setup_core__standalone.sh b/hydra_core__standalone/hydra_core__standalone/setup_core__standalone.sh deleted file mode 100755 index e217718..0000000 --- a/hydra_core__standalone/hydra_core__standalone/setup_core__standalone.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -HYDRA="hydra_core__standalone" -clear -FAILED=0 -echo -e "[ setting up $HYDRA ]" -which python3 > /dev/null 2>&1 -if [ $? -eq 1 ]; then echo "python3 not installed, install like pacman -Sy python3, apt install python3, brew install python3"; FAILED=1; fi -python3 -m pip > /dev/null 2>&1 -if [ $? -eq 1 ]; then echo "python3 pip module not installed, attempting to auto-install"; wget https://bootstrap.pypa.io/get-pip.py; python3 get-pip.py; fi -python3 -m pip > /dev/null 2>&1 -if [ $? -eq 1 ]; then echo "python3 pip module still not installed, manually install python3 pip module before proceeding"; FAILED=1; fi -which virtualenv > /dev/null 2>&1 -if [ $? -eq 1 ]; then echo "python3 virtualenv module not installed, attempting to auto-install"; python3 -m pip install virtualenv; fi -which virtualenv > /dev/null 2>&1 -if [ $? -eq 1 ]; then echo "python3 virtualenv module still not installed, manually instlal python3 virtualenv module before proceeding"; FAILED=1; fi -if [ $FAILED -eq 1 ]; then echo "pre-requisites not met, aborting installation"; exit 1; fi -which python3.9 > /dev/null 2>&1 -if [ $? -eq 0 ]; then virtualenv -p python3.9 env; else virtualenv python3 env; fi -source env/bin/activate -pip install --upgrade pip -pip install irc3 ipdb -echo -e "[ $HYDRA setup complete ]" -deactivate -echo "[ setting up $HYDRA activation ]" -echo "echo '[ running $HYDRA ]'" > run.sh -echo "source env/bin/activate" >> run.sh -echo "irc3 maple.ini" >> run.sh -echo "echo '[ $HYDRA bot finished ]'" >> run.sh -echo "deactivate" >> run.sh -echo "[ copying $HYDRA credentials ]" -sudo cat /root/maple/activate__$HYDRA >> env/bin/activate -if [ $? -eq 1 ] - then - echo "[ copying $HYDRA credentials failed, you will need to edit env/bin/activate manually ]" - echo '#################################################### ACTIVATION ##### SOF' >> env/bin/activate - echo 'export BOT_SASL_USERNAME=notmaple' >> env/bin/activate - echo 'export BOT_SASL_PASSWORD=notpassword' >> env/bin/activate - echo '#########################################################################' >> env/bin/activate - echo 'export HYDRA_DESIGNATION=core' >> env/bin/activate - echo 'export HYDRA_HOME="#b0ts3x"' >> env/bin/activate - echo 'export HYDRA_PURPOSE="uptime and designating tasks"' >> env/bin/activate - echo '#################################################### ACTIVATION ##### EOF' >> env/bin/activate -fi -echo "[ leaving setup and running $HYDRA ]" -mv $0 env -bash run.sh diff --git a/hydra_core__standalone/hydra_core__standalone/start.sh b/hydra_core__standalone/hydra_core__standalone/start.sh deleted file mode 100755 index 08a12ab..0000000 --- a/hydra_core__standalone/hydra_core__standalone/start.sh +++ /dev/null @@ -1,6 +0,0 @@ -echo '[ running hydra_core__standalone ]' -[ -e env ] || bash setup_core__standalone.sh -source env/bin/activate -sh -c 'echo $$>hydra_core__standalone.pid; exec irc3 maple.ini' -echo '[ hydra_core__standalone bot finished ]' -deactivate diff --git a/hydra_core__standalone/hydra_core__standalone/stop.sh b/hydra_core__standalone/hydra_core__standalone/stop.sh deleted file mode 100755 index 6940e72..0000000 --- a/hydra_core__standalone/hydra_core__standalone/stop.sh +++ /dev/null @@ -1 +0,0 @@ -pid=`cat hydra_core__standalone.pid` && kill -9 $pid