src/lua_objs.c
author Tero Marttila <terom@fixme.fi>
Tue, 31 Mar 2009 19:56:18 +0300
changeset 94 05a96b200d7b
parent 93 42ade8285570
child 96 a07d917adec1
permissions -rw-r--r--
wrap irc_net and add lua_net_join
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "lua_objs.h"
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <lua5.1/lua.h>
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <lua5.1/lualib.h>
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <lua5.1/lauxlib.h>
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
/**
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
 * Our lua wrapper for irc_net
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
 */
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    10
struct lua_net {
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    struct irc_net *net;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
};
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
/**
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    15
 * Create a lua_net userdata from the given irc_net and push it onto the stack, returning 1.
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    16
 */
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    17
static int lua_net_create (lua_State *L, struct irc_net *net)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    18
{
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    19
    // create the new userdata on the stack
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    20
    struct lua_net *lua_net = lua_newuserdata(L, sizeof(*lua_net));
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    21
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    22
    // get the type and set it
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    23
    luaL_getmetatable(L, "evirc.net");
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    24
    lua_setmetatable(L, -2);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    25
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    26
    // initialize
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    27
    lua_net->net = net;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    28
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    29
    // ok
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    30
    return 1;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    31
}
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    32
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    33
/**
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    34
 * Join a new channel, returning the lua_chan
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    35
 */
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    36
static int lua_net_join (lua_State *L)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    37
{
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    38
    struct lua_net *lua_net;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    39
    struct irc_chan_info chan_info;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    40
    struct irc_chan *chan;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    41
    struct error_info err;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    42
    
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    43
    // validate the lua_net arg
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    44
    if ((lua_net = luaL_checkudata(L, 1, "evirc.net")) == NULL)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    45
        return luaL_argerror(L, 1, "`evirc.net` expected");
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    46
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    47
    // the channel name
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    48
    chan_info.channel = luaL_checkstring(L, 2);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    49
    
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    50
    // add it
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    51
    if (irc_net_add_chan(lua_net->net, &chan, &chan_info, &err))
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    52
        return luaL_error(L, "irc_net_add_chan: %s: %s", chan_info.channel, error_msg(&err));
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    53
    
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    54
    // XXX: wrap it
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    55
    return 0;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    56
}
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    57
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    58
static const struct luaL_Reg lua_net_methods[] = {
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    59
    {   "join",         &lua_net_join       },
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    60
    {   NULL,           NULL                }
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    61
};
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    62
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    63
/**
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    64
 * Initialize the lua_net object type
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    65
 */
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    66
static err_t lua_net_init (lua_State *L)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    67
{
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    68
    luaL_newmetatable(L, "evirc.net");
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    69
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    70
    // set the metatable __index to itself
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    71
    lua_pushvalue(L, -1);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    72
    lua_setfield(L, -1, "__index");
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    73
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    74
    // register the methods to the metatable
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    75
    luaL_register(L, NULL, lua_net_methods);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    76
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    77
    return SUCCESS;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    78
}
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    79
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    80
/**
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
 * Wrapper for irc_client
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 */
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
struct lua_client {
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    struct irc_client *client;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
};
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
static int lua_client_quit (lua_State *L)
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
{
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    struct lua_client *lua_client;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    err_t err;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
   
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    // validate the lua_client arg
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    if ((lua_client = luaL_checkudata(L, 1, "evirc.client")) == NULL)
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
    94
        return luaL_argerror(L, 1, "`evirc.client` expected");
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    // the message
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    const char *message = luaL_checkstring(L, 2);
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // execute
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    if ((err = irc_client_quit(lua_client->client, message)))
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        return luaL_error(L, "irc_client_quit: %s", error_name(err));
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    // ok
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    return 0;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
}
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   107
static int lua_client_get_network (lua_State *L)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   108
{
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   109
    struct lua_client *lua_client;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   110
    struct irc_net *net;
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   111
    
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   112
    // validate the lua_client arg
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   113
    if ((lua_client = luaL_checkudata(L, 1, "evirc.client")) == NULL)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   114
        return luaL_argerror(L, 1, "`evirc.client` expected");
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   115
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   116
    // the network name
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   117
    const char *network = luaL_checkstring(L, 2);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   118
    
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   119
    // lookup the irc_net
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   120
    if ((net = irc_client_get_net(lua_client->client, network)) == NULL)
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   121
        return luaL_error(L, "irc_client_get_net: no such network: %s", network);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   122
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   123
    // wrap it
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   124
    return lua_net_create(L, net);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   125
}
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   126
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   127
static const struct luaL_Reg lua_client_methods[] = {
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   128
    {   "quit",         &lua_client_quit        },
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   129
    {   "network",      &lua_client_get_network },
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   130
    {   NULL,           NULL                    }
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
};
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
/**
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
 * Initializes a lua_irc_client wrapper for the given client in the give lua state. This registers a set of globals for
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
 * 'client' and 'networks'.
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
 */
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
static err_t lua_client_init (lua_State *L, struct irc_client *client)
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
{
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    // allocate the global "client" object
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    // XXX: mem errors?
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   141
    struct lua_client *lua_client = lua_newuserdata(L, sizeof(*lua_client));
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    // push a new metatable to identify the client object
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    luaL_newmetatable(L, "evirc.client");
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    // set the metatable __index to itself
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    lua_pushvalue(L, -1);
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    lua_setfield(L, -1, "__index");
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    // register the methods to the metatable
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   151
    luaL_register(L, NULL, lua_client_methods);
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    // set the client userdata's metatable
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    lua_setmetatable(L, -2);
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    // initialize it
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    lua_client->client = client;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    // store it as a global
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    lua_setglobal(L, "client");
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    // ok
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    return SUCCESS;
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
}
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
err_t lua_objs_init (lua_State *L, struct nexus *nexus)
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
{
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
    // init the various bits
94
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   169
    lua_client_init(L, nexus->client);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   170
    lua_net_init(L);
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   171
05a96b200d7b wrap irc_net and add lua_net_join
Tero Marttila <terom@fixme.fi>
parents: 93
diff changeset
   172
    return SUCCESS;
93
42ade8285570 add some rudimentary lua support, by having a simple interactive console, and providing access to irc_client_quit
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
}