diff --git a/python/logsize.py b/python/logsize.py index e38fa32..4d2fe78 100644 --- a/python/logsize.py +++ b/python/logsize.py @@ -17,6 +17,19 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # +# 2025-03-06: orkim (libera.#weechat) +# 0.5 : script always updates on buffer/window switch now +# : optionally, a timer can update the item in the background (e.g. while staying in one buffer) +# : fixed hook_process() call to update results on completion +# : fixed timer for updating log size without switching buffers/windows +# : fixed options help text displaying +# : fixed update for fset/script buffers/etc without logs +# : clear output on buffer/window switch +# : adjusted defaults +# : adjusted help text +# : added a "auto" to file size units +# : removed unused/unreachable code +# : general cleanup/comments/renames/etc # 2019-07-12: nils_2 (freenode.#weechat) # 0.4 : option "display" is evaluated # : use hook_process("wc") to not stall weechat anymore @@ -50,18 +63,17 @@ SCRIPT_NAME = "logsize" SCRIPT_AUTHOR = "nils_2 " -SCRIPT_VERSION = "0.4" +SCRIPT_VERSION = "0.5" SCRIPT_LICENSE = "GPL" SCRIPT_DESC = "display size of current logfile in item-bar" -OPTIONS = { "refresh" : ("0","refresh timer (in seconds). 0 = refresh only on buffer or window switch. this is the default setting"), - "size" : ("KB","display length in KB/MB/GB/TB. Leave option empty for byte"), - "display" : ("%L","possible item: %W = words, %L = lines or %F = file length. (content is evaluated, e.g. you can use colors with format \"${color:xxx}\", see /help eval)"), - "log_disabled" : ("","displays a text in item, when logger is disabled for buffer"), - "file_not_found": ("","displays a text in item, when logfile wasn't found"), +OPTIONS = { "refresh" : ("60","Refresh timer (in seconds). Setting 0 = refresh only on buffer or window switch."), + "size" : ("A","File size units in B/KB/MB/GB/TB or A for 'Auto'."), + "display" : ("%F","Possible item: %W = words in log, %L = lines in log, or %F for file size (in units). (Content is evaluated, e.g. you can use colors with format \"${color:xxx}\", see /help eval)."), + "log_disabled" : ("","Displays in item, when logger is disabled for buffer."), + "file_not_found": ("","Displays in item, when logfile wasn't found."), } -hooks = { "timer": "", "bar_item": "" } -hook_process_out = [] +hooks = { "timer": "" } output = "" # regexp to match ${color} tags @@ -70,10 +82,19 @@ # regexp to match ${optional string} tags regex_optional_tags=re.compile('%\{[^\{\}]+\}') + # ================================[ size ]=============================== def sizecheck(filesize): filesize = int(filesize) - if OPTIONS["size"].lower() == "kb": + if OPTIONS["size"].lower() == "a": + units = ['b', 'K', 'M', 'G', 'T'] + divides = 0 + while filesize > 1024 and divides < 4: + filesize = filesize / 1024 + divides += 1 + filesize = "%.2f" % filesize + size = units[divides] + elif OPTIONS["size"].lower() == "kb": filesize = "%.2f" % (filesize / 1024) size = "K" elif OPTIONS["size"].lower() == "mb": @@ -90,127 +111,133 @@ def sizecheck(filesize): size = "b" return "%s%s" % (filesize,size) + # ================================[ weechat item ]=============================== def show_item (data, item, window): global output return output + +def get_logfile(ptr_buffer): + log_filename = "" + log_enabled = 0 + infolist = weechat.infolist_get('logger_buffer','','') + while weechat.infolist_next(infolist): + bpointer = weechat.infolist_pointer(infolist, 'buffer') + if ptr_buffer == bpointer: + log_filename = weechat.infolist_string(infolist, 'log_filename') + log_enabled = weechat.infolist_integer(infolist, 'log_enabled') + log_level = weechat.infolist_integer(infolist, 'log_level') + weechat.infolist_free(infolist) # free infolist() + + return (log_filename,log_enabled) + + def get_file_information(ptr_buffer): - global hook_process_out, output + global output (logfile,log_enabled) = get_logfile(ptr_buffer) if not log_enabled: output = OPTIONS["log_disabled"] + weechat.bar_item_update(SCRIPT_NAME) return - output = '' if logfile != '': - # newline / word / bytes / filename - weechat.hook_process("wc %s" % logfile, 50000, "my_hook_process_cb", "") - if hook_process_out: - lines = hook_process_out[0] - words = hook_process_out[1] - flength = sizecheck(hook_process_out[2]) - - tags = {'%L': str(lines), - '%W': str(words), - '%F': str(flength)} - - output = substitute_colors(OPTIONS['display']) - # replace mandatory tags - for tag in list(tags.keys()): - # for tag in tags.keys(): - output = output.replace(tag, tags[tag]) - weechat.bar_item_update(SCRIPT_NAME) + # fork process to get data for item + weechat.hook_process("wc %s" % logfile, 5000, "my_hook_process_cb", "") + else: + # even though logging is not disabled, it may not be logging + # example: fset buffer/script buffer/etc + + # logfile is empty, clear item + output = '' + weechat.bar_item_update(SCRIPT_NAME) + return + def substitute_colors(text): if int(version) >= 0x00040200: return weechat.string_eval_expression(text,{},{},{}) # substitute colors in output return re.sub(regex_color, lambda match: weechat.color(match.group(1)), text) -def get_logfile(ptr_buffer): - log_filename = "" - log_enabled = 0 - infolist = weechat.infolist_get('logger_buffer','','') - while weechat.infolist_next(infolist): - bpointer = weechat.infolist_pointer(infolist, 'buffer') - if ptr_buffer == bpointer: - log_filename = weechat.infolist_string(infolist, 'log_filename') - log_enabled = weechat.infolist_integer(infolist, 'log_enabled') - log_level = weechat.infolist_integer(infolist, 'log_level') - weechat.infolist_free(infolist) # free infolist() - - return (log_filename,log_enabled) def item_update(data, remaining_calls): - global hooks - weechat.bar_item_update(SCRIPT_NAME) + get_file_information(weechat.current_buffer()) return weechat.WEECHAT_RC_OK + # ================================[ hook process]=============================== def my_hook_process_cb(data, command, return_code, out, err): - global hook_process_out + global output if return_code == weechat.WEECHAT_HOOK_PROCESS_ERROR: weechat.prnt("", "Error with command '%s'" % command) return weechat.WEECHAT_RC_OK # if return_code >= 0: # weechat.prnt("", "return_code = %d" % return_code) if out != "": - hook_process_out = out.split() + out_split = out.split() + # newline / word / bytes / filename + lines = out_split[0] + words = out_split[1] + flength = sizecheck(out_split[2]) + + tags = {'%L': str(lines), + '%W': str(words), + '%F': str(flength)} + + output = substitute_colors(OPTIONS['display']) + # replace mandatory tags + for tag in list(tags.keys()): + output = output.replace(tag, tags[tag]) + + weechat.bar_item_update(SCRIPT_NAME) if err != "": weechat.prnt("", "stderr: %s" % err) return weechat.WEECHAT_RC_OK + # ================================[ weechat hook ]=============================== def window_switch_cb(data, signal, signal_data): - window = signal_data - window = weechat.current_window() - ptr_buffer = weechat.window_get_pointer(window,"buffer") - get_file_information(ptr_buffer) + global output + output = '' + weechat.bar_item_update(SCRIPT_NAME) + get_file_information(weechat.current_buffer()) return weechat.WEECHAT_RC_OK -def buffer_switch_cb(data, signal, signal_data): - ptr_buffer = signal_data - window = weechat.current_window() - ptr_buffer = weechat.window_get_pointer(window,'buffer') - if ptr_buffer == '': - return '' - get_file_information(ptr_buffer) - return weechat.WEECHAT_RC_OK -def hook_timer_refresh_item_cb(data, remaining_calls): +def buffer_switch_cb(data, signal, signal_data): + global output + output = '' weechat.bar_item_update(SCRIPT_NAME) + get_file_information(weechat.current_buffer()) return weechat.WEECHAT_RC_OK + def unhook_timer(): global hooks if hooks["timer"] != "": - weechat.bar_item_remove(hooks["bar_item"]) weechat.unhook(hooks["timer"]) hooks["timer"] = "" - hooks["bar_item"] + def hook_timer(): global hooks hooks["timer"] = weechat.hook_timer(int(OPTIONS["refresh"]) * 1000, 0, 0, 'item_update', '') - hooks["bar_item"] = weechat.bar_item_new(SCRIPT_NAME, 'show_item','') - if hooks["timer"] == 0: weechat.prnt('',"%s: can't enable %s, hook failed" % (weechat.prefix("error"), SCRIPT_NAME)) - weechat.bar_item_remove(hooks["bar_item"]) - hooks["bar_item"] = "" return 0 - weechat.bar_item_update(SCRIPT_NAME) return 1 + # ================================[ weechat options and description ]=============================== -def toggle_refresh(pointer, name, value): +def monitor_config_options(pointer, name, value): global hooks option = name[len('plugins.var.python.' + SCRIPT_NAME + '.'):] # get optionname OPTIONS[option] = value # save new value + # monitor the 'refresh' option if option == 'refresh': # option "refresh" changed by user? if hooks["timer"] != "": # timer currently running? if OPTIONS['refresh'] != "0": # new user setting not zero? @@ -221,31 +248,45 @@ def toggle_refresh(pointer, name, value): elif hooks["timer"] == "": # hook is empty if OPTIONS['refresh'] != "0": # option is not zero! hook_timer() # install hook - weechat.bar_item_update(SCRIPT_NAME) + return weechat.WEECHAT_RC_OK + def init_options(): global OPTIONS for option, value in list(OPTIONS.items()): - weechat.config_set_desc_plugin(option, '%s (default: "%s")' % (value[1], value[0])) if not weechat.config_is_set_plugin(option): weechat.config_set_plugin(option, value[0]) OPTIONS[option] = value[0] else: OPTIONS[option] = weechat.config_get_plugin(option) + + # set description for option + weechat.config_set_desc_plugin(option, '%s (default: "%s")' % (value[1], value[0])) + + # ================================[ main ]=============================== if __name__ == "__main__": if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, '', ''): version = weechat.info_get("version_number", "") or 0 + # initially set (or read in) current options init_options() + # monitor any config options updates + weechat.hook_config( 'plugins.var.python.' + SCRIPT_NAME + '.*', 'monitor_config_options', '' ) + + # our logsize bar item + weechat.bar_item_new(SCRIPT_NAME, 'show_item','') + + # optional: update on a timer if OPTIONS["refresh"] != "0": hook_timer() - else: - weechat.hook_signal("buffer_switch","buffer_switch_cb","") - weechat.hook_signal("window_switch","window_switch_cb","") - weechat.bar_item_new(SCRIPT_NAME, 'show_item','') - weechat.bar_item_update(SCRIPT_NAME) - weechat.hook_config( 'plugins.var.python.' + SCRIPT_NAME + '.*', 'toggle_refresh', '' ) + + # udpate on window/buffer switch + weechat.hook_signal("buffer_switch","buffer_switch_cb","") + weechat.hook_signal("window_switch","window_switch_cb","") + + # do initial logsize update + get_file_information(weechat.current_buffer())