degesch: get rid of Lua timer hooks
Since they were the exception and have been replaced with the async API.
This commit is contained in:
		
							
								
								
									
										48
									
								
								degesch.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								degesch.c
									
									
									
									
									
								
							@@ -9073,7 +9073,6 @@ enum lua_hook_type
 | 
				
			|||||||
	XLUA_HOOK_IRC,                      ///< IRC hook
 | 
						XLUA_HOOK_IRC,                      ///< IRC hook
 | 
				
			||||||
	XLUA_HOOK_PROMPT,                   ///< Prompt hook
 | 
						XLUA_HOOK_PROMPT,                   ///< Prompt hook
 | 
				
			||||||
	XLUA_HOOK_COMPLETION,               ///< Autocomplete
 | 
						XLUA_HOOK_COMPLETION,               ///< Autocomplete
 | 
				
			||||||
	XLUA_HOOK_TIMER,                    ///< One-shot timer
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct lua_hook
 | 
					struct lua_hook
 | 
				
			||||||
@@ -9088,8 +9087,6 @@ struct lua_hook
 | 
				
			|||||||
		struct irc_hook irc_hook;       ///< IRC hook
 | 
							struct irc_hook irc_hook;       ///< IRC hook
 | 
				
			||||||
		struct prompt_hook prompt_hook; ///< IRC hook
 | 
							struct prompt_hook prompt_hook; ///< IRC hook
 | 
				
			||||||
		struct completion_hook c_hook;  ///< Autocomplete hook
 | 
							struct completion_hook c_hook;  ///< Autocomplete hook
 | 
				
			||||||
 | 
					 | 
				
			||||||
		struct poller_timer timer;      ///< Timer
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	data;                               ///< Hook data
 | 
						data;                               ///< Hook data
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -9113,9 +9110,6 @@ lua_hook_unhook (lua_State *L)
 | 
				
			|||||||
	case XLUA_HOOK_COMPLETION:
 | 
						case XLUA_HOOK_COMPLETION:
 | 
				
			||||||
		LIST_UNLINK (hook->plugin->ctx->completion_hooks, &hook->data.hook);
 | 
							LIST_UNLINK (hook->plugin->ctx->completion_hooks, &hook->data.hook);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case XLUA_HOOK_TIMER:
 | 
					 | 
				
			||||||
		poller_timer_reset (&hook->data.timer);
 | 
					 | 
				
			||||||
		break;
 | 
					 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		hard_assert (!"invalid hook type");
 | 
							hard_assert (!"invalid hook type");
 | 
				
			||||||
	case XLUA_HOOK_DEFUNCT:
 | 
						case XLUA_HOOK_DEFUNCT:
 | 
				
			||||||
@@ -9302,26 +9296,6 @@ lua_completion_hook_complete (struct completion_hook *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
					// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
lua_timer_hook_dispatch (void *user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct lua_hook *hook = user_data;
 | 
					 | 
				
			||||||
	struct lua_plugin *plugin = hook->plugin;
 | 
					 | 
				
			||||||
	lua_State *L = plugin->L;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	lua_rawgeti (L, LUA_REGISTRYINDEX, hook->ref_callback);
 | 
					 | 
				
			||||||
	lua_rawgetp (L, LUA_REGISTRYINDEX, hook);  // 1: hook
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct error *e = NULL;
 | 
					 | 
				
			||||||
	if (!lua_plugin_call (plugin, 1, 0, &e))
 | 
					 | 
				
			||||||
		lua_plugin_log_error (plugin, "timer hook", e);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// There's no need to keep the hook around once the timer is dispatched
 | 
					 | 
				
			||||||
	lua_cache_invalidate (L, hook);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct lua_hook *
 | 
					static struct lua_hook *
 | 
				
			||||||
lua_plugin_push_hook (lua_State *L, struct lua_plugin *plugin,
 | 
					lua_plugin_push_hook (lua_State *L, struct lua_plugin *plugin,
 | 
				
			||||||
	int callback_index, enum lua_hook_type type, int priority)
 | 
						int callback_index, enum lua_hook_type type, int priority)
 | 
				
			||||||
@@ -9392,27 +9366,6 @@ lua_plugin_hook_completion (lua_State *L)
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					 | 
				
			||||||
lua_plugin_hook_timer (lua_State *L)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct lua_plugin *plugin = lua_touserdata (L, lua_upvalueindex (1));
 | 
					 | 
				
			||||||
	lua_Integer timeout = luaL_checkinteger (L, 2);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (timeout < 0)
 | 
					 | 
				
			||||||
		luaL_argerror (L, 2, "timeout mustn't be negative");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// This doesn't really hook anything but we can reuse the code
 | 
					 | 
				
			||||||
	struct lua_hook *hook = lua_plugin_push_hook
 | 
					 | 
				
			||||||
		(L, plugin, 1, XLUA_HOOK_TIMER, 0 /* priority doesn't apply */);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct poller_timer *timer = &hook->data.timer;
 | 
					 | 
				
			||||||
	poller_timer_init (timer, &plugin->ctx->poller);
 | 
					 | 
				
			||||||
	timer->dispatcher = lua_timer_hook_dispatch;
 | 
					 | 
				
			||||||
	timer->user_data = hook;
 | 
					 | 
				
			||||||
	poller_timer_set (timer, timeout);
 | 
					 | 
				
			||||||
	return 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
					// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define XLUA_SCHEMA_METATABLE "schema"  ///< Identifier for the Lua metatable
 | 
					#define XLUA_SCHEMA_METATABLE "schema"  ///< Identifier for the Lua metatable
 | 
				
			||||||
@@ -10096,7 +10049,6 @@ static luaL_Reg lua_plugin_library[] =
 | 
				
			|||||||
	{ "hook_irc",        lua_plugin_hook_irc        },
 | 
						{ "hook_irc",        lua_plugin_hook_irc        },
 | 
				
			||||||
	{ "hook_prompt",     lua_plugin_hook_prompt     },
 | 
						{ "hook_prompt",     lua_plugin_hook_prompt     },
 | 
				
			||||||
	{ "hook_completion", lua_plugin_hook_completion },
 | 
						{ "hook_completion", lua_plugin_hook_completion },
 | 
				
			||||||
	{ "hook_timer",      lua_plugin_hook_timer      },
 | 
					 | 
				
			||||||
	{ "setup_config",    lua_plugin_setup_config    },
 | 
						{ "setup_config",    lua_plugin_setup_config    },
 | 
				
			||||||
	{ "connect",         lua_plugin_connect         },
 | 
						{ "connect",         lua_plugin_connect         },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,7 @@ degesch.setup_config {
 | 
				
			|||||||
	},
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async, await = degesch.async, coroutine.yield
 | 
				
			||||||
degesch.hook_irc (function (hook, server, line)
 | 
					degesch.hook_irc (function (hook, server, line)
 | 
				
			||||||
	local msg = degesch.parse (line)
 | 
						local msg = degesch.parse (line)
 | 
				
			||||||
	if msg.command ~= "KICK" then return line end
 | 
						if msg.command ~= "KICK" then return line end
 | 
				
			||||||
@@ -39,9 +40,10 @@ degesch.hook_irc (function (hook, server, line)
 | 
				
			|||||||
	local who = msg.prefix:match ("^[^!]*")
 | 
						local who = msg.prefix:match ("^[^!]*")
 | 
				
			||||||
	local channel, whom = table.unpack (msg.params)
 | 
						local channel, whom = table.unpack (msg.params)
 | 
				
			||||||
	if who ~= whom and whom == server.user.nickname then
 | 
						if who ~= whom and whom == server.user.nickname then
 | 
				
			||||||
		degesch.hook_timer (function (hook)
 | 
							async.go (function ()
 | 
				
			||||||
 | 
								await (async.timer_ms (timeout * 1000))
 | 
				
			||||||
			server:send ("JOIN " .. channel)
 | 
								server:send ("JOIN " .. channel)
 | 
				
			||||||
		end, timeout * 1000)
 | 
							end)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	return line
 | 
						return line
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user