5555# 2023-09-02: nils_2, (libera.#weechat)
5656# 1.1 : one more check for buffer_ptr
5757
58+ # 2023-09-08: nils_2, (libera.#weechat)
59+ # 1.2 : ignore exclude channels on non-irc buffers, internal changes
5860
5961# idea and testing by DJ-ArcAngel
6062
6870
6971SCRIPT_NAME = "collapse_channel"
7072SCRIPT_AUTHOR = "nils_2 <weechatter@arcor.de>"
71- SCRIPT_VERSION = "1.1 "
73+ SCRIPT_VERSION = "1.2 "
7274SCRIPT_LICENSE = "GPL"
7375SCRIPT_DESC = "collapse channel buffers from servers without focus"
7476
7981 'activity' : ('off' ,'show channels with activity only (see option hotlist). all exclude options will be ignored' ),
8082 }
8183
82- # ================================[ buffer ]===============================
84+ # ================================[ buffer open/closed ]===============================
8385def buffer_opened_closed_cb (data , signal , signal_data ):
8486 global OPTIONS
85-
8687 # sadly localvar not set in this moment, when buffer opens! :-(
8788 # server = weechat.buffer_get_string(signal_data, 'localvar_server') # get internal servername
8889 infolist = weechat .infolist_get ('buffer' , signal_data , '' )
@@ -107,13 +108,13 @@ def buffer_opened_closed_cb(data, signal, signal_data):
107108 buffer_ptr = weechat .buffer_search ('irc' , 'server.%s' % server )
108109 if buffer_ptr :
109110 weechat .command (buffer_ptr ,'/allchan -current /buffer unhide' )
111+ weechat .command ('' ,'/allchan -exclude=%s /buffer hide' % OPTIONS ['channel_exclude' ])
110112 exclude_server ()
111113 single_channel_exclude ()
112114 else :
113115 weechat .command ('' ,'/allchan /buffer hide' )
114116 exclude_hotlist ()
115117 return weechat .WEECHAT_RC_OK
116-
117118# ============================[ buffer_switch ]===========================
118119def buffer_switch_cb (data , signal , signal_data ):
119120 global OPTIONS , version
@@ -123,9 +124,10 @@ def buffer_switch_cb(data, signal, signal_data):
123124 return weechat .WEECHAT_RC_OK
124125
125126 # when you /join a buffer and irc.look.buffer_switch_join is ON, the new buffer pointer is not useable at this time
127+ weechat .command ("" ,"/wait 1ms /mute" )
126128 server = weechat .buffer_get_string (signal_data , 'localvar_server' ) # get internal servername
127- buffer_ptr = weechat .buffer_search ('irc' , 'server.%s' % server )
128- if not buffer_ptr : # buffer pointer exists?
129+ buffer_ptr = weechat .buffer_search ('irc' , 'server.%s' % server ) # looks for server. (This does not effect eg server raw buffer)
130+ if not buffer_ptr and server != 'irc_raw' : # buffer pointer exists?
129131 return weechat .WEECHAT_RC_OK # no!
130132
131133 if OPTIONS ['activity' ].lower () == 'no' or OPTIONS ['activity' ].lower () == 'off' or OPTIONS ['activity' ].lower () == '0' :
@@ -146,11 +148,44 @@ def buffer_switch_cb(data, signal, signal_data):
146148 weechat .command (bufpointer ,'/buffer unhide' ) # unhide current channel
147149 exclude_hotlist ()
148150 return weechat .WEECHAT_RC_OK
149-
151+ # ================================[ hotlist changed ]==============================
152+ def hotlist_changed_cb (data , signal , signal_data ):
153+ if not signal_data :
154+ plugin_name = weechat .buffer_get_string (weechat .current_buffer (), 'localvar_plugin' )
155+ # TODO how about matrix script or other non-irc channel buffer? no idea! help is welcome
156+ if plugin_name != 'irc' : # script only support irc plugin!
157+ return weechat .WEECHAT_RC_OK
158+ # weechat.command('', '/allchan /buffer hide')
159+ if OPTIONS ['activity' ].lower () == 'no' or OPTIONS ['activity' ].lower () == 'off' or OPTIONS ['activity' ].lower () == '0' :
160+ exclude_server ()
161+ single_channel_exclude ()
162+ exclude_hotlist ()
163+ return weechat .WEECHAT_RC_OK
164+ # ================================[ window switch ]===============================
150165def window_switch_cb (data , signal , signal_data ):
151166 bufpointer = weechat .window_get_pointer (signal_data ,'buffer' )
152167 buffer_switch_cb (data ,signal ,bufpointer )
153168 return weechat .WEECHAT_RC_OK
169+ # ================================[ server signals ]===============================
170+ def irc_server_disconnected_cb (data , signal , signal_data ):
171+ buffer_switch_cb (data ,signal ,signal_data )
172+ return weechat .WEECHAT_RC_OK
173+
174+ def irc_server_connected_cb (data , signal , signal_data ):
175+ buffer_switch_cb (data ,signal ,signal_data )
176+ return weechat .WEECHAT_RC_OK
177+
178+ def exclude_hotlist ():
179+ if OPTIONS ['hotlist' ] == '0' or OPTIONS ['hotlist' ] == '' :
180+ return weechat .WEECHAT_RC_OK
181+ infolist = weechat .infolist_get ('hotlist' , '' , '' )
182+ while weechat .infolist_next (infolist ):
183+ buffer_number = weechat .infolist_integer (infolist , 'buffer_number' )
184+ priority = weechat .infolist_integer (infolist , 'priority' )
185+ if int (OPTIONS ['hotlist' ]) == priority or OPTIONS ['hotlist' ] == '4' :
186+ weechat .command ('' ,'/buffer unhide %s' % buffer_number )
187+ weechat .infolist_free (infolist )
188+ return weechat .WEECHAT_RC_OK
154189
155190def exclude_server ():
156191 global OPTIONS
@@ -192,40 +227,6 @@ def single_channel_exclude():
192227 # space separated list for /buffer unhide
193228 weechat .command ('' ,'/buffer unhide %s' % OPTIONS ['single_channel_exclude' ])
194229 return
195- # ================================[ server ]===============================
196- def irc_server_disconnected_cb (data , signal , signal_data ):
197- buffer_switch_cb (data ,signal ,signal_data )
198- return weechat .WEECHAT_RC_OK
199-
200- def irc_server_connected_cb (data , signal , signal_data ):
201- buffer_switch_cb (data ,signal ,signal_data )
202- return weechat .WEECHAT_RC_OK
203-
204- # ================================[ hotlist ]==============================
205- def hotlist_changed_cb (data , signal , signal_data ):
206- if not signal_data :
207- plugin_name = weechat .buffer_get_string (weechat .current_buffer (), 'localvar_plugin' )
208- # TODO how about matrix script or other non-irc channel buffer? no idea! help is welcome
209- if plugin_name != 'irc' : # for example /fset, /color etc.pp buffer
210- weechat .command ('' , '/allchan /buffer hide' )
211- if OPTIONS ['activity' ].lower () == 'no' or OPTIONS ['activity' ].lower () == 'off' or OPTIONS ['activity' ].lower () == '0' :
212- exclude_server ()
213- single_channel_exclude ()
214-
215- exclude_hotlist ()
216- return weechat .WEECHAT_RC_OK
217-
218- def exclude_hotlist ():
219- if OPTIONS ['hotlist' ] == '0' or OPTIONS ['hotlist' ] == '' :
220- return weechat .WEECHAT_RC_OK
221- infolist = weechat .infolist_get ('hotlist' , '' , '' )
222- while weechat .infolist_next (infolist ):
223- buffer_number = weechat .infolist_integer (infolist , 'buffer_number' )
224- priority = weechat .infolist_integer (infolist , 'priority' )
225- if int (OPTIONS ['hotlist' ]) == priority or OPTIONS ['hotlist' ] == '4' :
226- weechat .command ('' ,'/buffer unhide %s' % buffer_number )
227- weechat .infolist_free (infolist )
228- return weechat .WEECHAT_RC_OK
229230# ================================[ weechat options & description ]===============================
230231def init_options ():
231232 for option ,value in list (OPTIONS .items ()):
@@ -258,7 +259,8 @@ def shutdown_cb():
258259 weechat .hook_command (SCRIPT_NAME ,SCRIPT_DESC ,
259260 '' ,
260261 "Note: channels from disconnected server will be displayed and won't hidden automatically.\n "
261- 'Use the /fset plugin to configure script: /fset collapse_channel' ,
262+ '- This script only affects channels from irc plugin.\n '
263+ '- Use the /fset plugin to configure script: /fset collapse_channel' ,
262264 '' ,
263265 '' ,
264266 '' )
0 commit comments