src/lua_irc.c
author Tero Marttila <terom@fixme.fi>
Thu, 28 May 2009 01:17:36 +0300
branchnew-lib-errors
changeset 219 cefec18b8268
parent 199 8eb839fbabba
permissions -rw-r--r--
some of the lib/transport stuff compiles
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include "lua_irc.h"
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
     2
#include "lua_func.h"
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <stdlib.h>
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include <string.h>
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     7
static struct lua_type lua_chan_type = LUA_TYPE("evirc.chan");
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
     8
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
 * Create a lua_chan userdata from the given irc_chan and leave it on the stack, returning 1
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
 */
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
static int lua_chan_create (lua_State *L, struct irc_chan *chan)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
{
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    // create the new obj
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    15
    struct lua_chan *lua_chan = lua_type_create(L, &lua_chan_type, sizeof(*lua_chan));
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    // initialize
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    lua_chan->chan = chan;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    // ok
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    return 1;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
 * Return the channel name as a lua string
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    27
static struct lua_func lua_chan__tostring_func = LUA_FUNC(&lua_chan_type, "__tostring",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    28
        "format using channel name",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    29
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    30
        LUA_FUNC_ARG_END
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    31
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    32
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    33
static int lua_chan__tostring (lua_State *L)
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    35
    struct lua_chan *lua_chan;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    36
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    37
    lua_args_parse(L, &lua_chan__tostring_func, (void *) &lua_chan);
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    lua_pushfstring(L, "<irc_chan %s>", irc_chan_name(lua_chan->chan));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    return 1;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
 * Send a PRIVMSG to the channel
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    47
static struct lua_func lua_chan_say_func = LUA_FUNC(&lua_chan_type, "evirc.chan.say",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    48
        "send a message to a channel",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    49
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    50
        LUA_FUNC_ARG_STRING("message",      LUA_ARG_STRING_REQUIRED )
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    51
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    52
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
static int lua_chan_say (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    55
    struct lua_chan *lua_chan;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    err_t err;
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    57
    const char *message;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    59
    // parse args
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    60
    lua_args_parse(L, &lua_chan_say_func, (void *) &lua_chan,
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    61
            &message
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    62
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    // send
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    if ((err = irc_chan_PRIVMSG(lua_chan->chan, message)))
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        return luaL_error(L, "irc_chan_PRIVMSG: '%s': %s", message, error_name(err));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    // ok
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    return 0;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    72
static struct lua_method lua_chan_methods[] = LUA_METHODS(
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    73
        LUA_METHOD("__tostring",    lua_chan__tostring, &lua_chan__tostring_func    ),
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    74
        LUA_METHOD("say",           lua_chan_say,       &lua_chan_say_func          )
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    75
    );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    77
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    78
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    79
static struct lua_type lua_net_type = LUA_TYPE("evirc.net");
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 * Create a lua_net userdata from the given irc_net and push it onto the stack, returning 1.
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 */
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
static int lua_net_create (lua_State *L, struct irc_net *net)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
{
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    // create the new obj
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    87
    struct lua_net *lua_net = lua_type_create(L, &lua_net_type, sizeof(*lua_net));
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    // initialize
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    lua_net->net = net;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    // ok
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    return 1;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
 * Return the network name as a lua string
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
    99
static struct lua_func lua_net__tostring_func = LUA_FUNC(&lua_net_type, "__tostring",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   100
        "format using network name",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   101
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   102
        LUA_FUNC_ARG_END
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   103
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   104
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   105
static int lua_net__tostring (lua_State *L)
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   107
    struct lua_net *lua_net;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   108
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   109
    lua_args_parse(L, &lua_net__tostring_func, (void *) &lua_net);
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    lua_pushfstring(L, "<irc_net %s>", irc_net_name(lua_net->net));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    return 1;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
 * Join a new channel, returning the lua_chan
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   119
static struct lua_func lua_net_join_func = LUA_FUNC(&lua_net_type, "join",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   120
        "create a new channel and join it",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   121
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   122
        LUA_FUNC_ARG_STRING("channel",      LUA_ARG_STRING_REQUIRED)
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   123
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   124
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   125
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
static int lua_net_join (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   128
    struct lua_net *lua_net;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    struct irc_chan_info chan_info;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    struct irc_chan *chan;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    struct error_info err;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    // the channel name
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   134
    lua_args_parse(L, &lua_net_join_func, (void *) &lua_net,
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   135
            &chan_info.channel
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   136
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    // add it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    if (irc_net_add_chan(lua_net->net, &chan, &chan_info, &err))
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        return luaL_error(L, "irc_net_add_chan: %s: %s", chan_info.channel, error_msg(&err));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    // return it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    return lua_chan_create(L, chan);    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
/**
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
 * Look up a channel by name, returning the lua_chan
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
 */
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   149
static struct lua_func lua_net_get_chan_func = LUA_FUNC(&lua_net_type, "channel",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   150
        "look up a channel by name",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   151
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   152
        LUA_FUNC_ARG_STRING("channel",      LUA_ARG_STRING_REQUIRED)
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   153
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   154
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
static int lua_net_get_chan (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   157
    struct lua_net *lua_net;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    struct irc_chan *chan;
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   159
    const char *channel;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   160
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   161
    // parse args
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   162
    lua_args_parse(L, &lua_net_get_chan_func, (void *) &lua_net,
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   163
            &channel
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   164
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    // lookup the irc_chan
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    if ((chan = irc_net_get_chan(lua_net->net, channel)) == NULL)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        return luaL_error(L, "irc_net_get_chan: no such channel: %s", channel);
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    // wrap it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    return lua_chan_create(L, chan);
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   174
static struct lua_func lua_net_channels_func = LUA_FUNC(&lua_net_type, "channels",
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   175
        "Return an iterater over the network's channels",
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   176
        
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   177
        LUA_FUNC_ARG_END
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   178
    );
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   179
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   180
static int lua_net_channels_iter (lua_State *L)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   181
{
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   182
    int nargs = lua_gettop(L);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   183
    struct lua_net *lua_net = lua_arg_obj(L, nargs, 1, &lua_net_type, false);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   184
    struct lua_chan *lua_chan = lua_arg_obj(L, nargs, 2, &lua_chan_type, true);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   185
    struct irc_chan *chan_next;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   186
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   187
    // get next item from current
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   188
    if (lua_chan)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   189
        chan_next = TAILQ_NEXT(lua_chan->chan, net_channels);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   190
    else
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   191
        chan_next = TAILQ_FIRST(&lua_net->net->channels);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   192
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   193
    // push return value - next item
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   194
    if (chan_next)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   195
        lua_chan_create(L, chan_next);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   196
    else
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   197
        lua_pushnil(L);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   198
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   199
    return 1;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   200
}
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   201
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   202
static int lua_net_channels (lua_State *L)
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   203
{
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   204
    struct lua_net *lua_net;
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   205
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   206
    // parse args
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   207
    lua_args_parse(L, &lua_net_channels_func, (void *) &lua_net);
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   208
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   209
    // push iter func
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   210
    lua_pushcfunction(L, lua_net_channels_iter);
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   211
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   212
    // push invariant state - the lua_net
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   213
    lua_pushvalue(L, 1);
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   214
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   215
    // return iter three-tuple
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   216
    return 2;
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   217
}
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   218
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   219
static struct lua_method lua_net_methods[] = LUA_METHODS(
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   220
        LUA_METHOD("__tostring",    lua_net__tostring,  &lua_net__tostring_func ),
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   221
        LUA_METHOD("join",          lua_net_join,       &lua_net_join_func      ),
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   222
        LUA_METHOD("channel",       lua_net_get_chan,   &lua_net_get_chan_func  ),
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   223
        LUA_METHOD("channels",      lua_net_channels,   &lua_net_channels_func  )
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   224
    );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   227
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   228
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   229
static struct lua_type lua_client_type = LUA_TYPE("evirc.client");
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   230
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   231
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   232
static struct lua_func lua_client_set_defaults_func = LUA_FUNC(&lua_client_type, "set_defaults", 
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   233
        "set the default settings to use for evirc.client.connect",
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   234
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   235
        LUA_FUNC_ARG_STRING("nickname",     LUA_ARG_STRING_REQUIRED ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   236
        LUA_FUNC_ARG_STRING("username",     LUA_ARG_STRING_REQUIRED ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   237
        LUA_FUNC_ARG_STRING("realname",     LUA_ARG_STRING_REQUIRED ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   238
        LUA_FUNC_ARG_STRING("service",      IRC_PORT                ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   239
        LUA_FUNC_ARG_STRING("service_ssl",  IRC_SSL_PORT            )
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   240
    );
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   241
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
static int lua_client_set_defaults (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
{
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   244
    struct lua_client *lua_client;
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   245
    const char *nickname, *username, *realname, *service, *service_ssl;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   247
    // parse args
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   248
    lua_args_parse(L, &lua_client_set_defaults_func, (void *) &lua_client,
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   249
            &nickname, &username, &realname, &service, &service_ssl
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   250
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   252
    // set
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   253
    struct irc_client_defaults defaults = {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   254
        .register_info = {
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   255
            .nickname   = nickname,
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   256
            .username   = username,
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   257
            .realname   = realname
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   258
        },
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   259
        .service        = service,
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   260
        .service_ssl    = service_ssl
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   261
    };
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
    // invoke
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   264
    // XXX: needs to be copied
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   265
    irc_client_set_defaults(lua_client->client, &defaults);
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
    // ok
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
    return 0;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   271
static struct lua_func lua_client_connect_func = LUA_FUNC(&lua_client_type, "connect",
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   272
        "Create and return a new IRC network",
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   273
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   274
        LUA_FUNC_ARG_STRING("network",      LUA_ARG_STRING_REQUIRED ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   275
        LUA_FUNC_ARG_STRING("hostname",     LUA_ARG_STRING_REQUIRED ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   276
        LUA_FUNC_ARG_STRING("service",      NULL                    ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   277
        LUA_FUNC_ARG_BOOL(  "ssl",          false                   ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   278
        LUA_FUNC_ARG_STRING("ssl_cafile",   NULL                    ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   279
        LUA_FUNC_ARG_BOOL(  "ssl_verify",   false                   ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   280
        LUA_FUNC_ARG_STRING("ssl_cert",     NULL                    ),
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   281
        LUA_FUNC_ARG_STRING("ssl_pkey",     NULL                    )
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   282
);
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   283
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
static int lua_client_connect (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
{
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   286
    struct lua_client *lua_client;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
    struct irc_net_info net_info;
141
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   288
    const char *ssl_cafile = NULL, *ssl_cert = NULL, *ssl_pkey = NULL;
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   289
    bool use_ssl = false, ssl_verify = false;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
    struct irc_net *net;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
    struct error_info err;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
    // init net_info
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
    memset(&net_info, 0, sizeof(net_info));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
143
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   296
    // parse args
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   297
    lua_args_parse(L, &lua_client_connect_func, (void *) &lua_client,
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   298
        &net_info.network, &net_info.hostname, &net_info.service,
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   299
        &use_ssl, &ssl_cafile, &ssl_verify, &ssl_cert, &ssl_pkey
1edab39c88a8 implement lua_args_parse
Tero Marttila <terom@fixme.fi>
parents: 142
diff changeset
   300
    );
141
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   301
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   302
    // SSL?
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   303
    if (use_ssl || ssl_cafile || ssl_verify || ssl_cert || ssl_pkey) {
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   304
        // verify
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   305
        if ((ssl_cert || ssl_pkey) && !(ssl_cert && ssl_pkey))
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   306
            return luaL_error(L, "must give both ssl_cert and ssl_pkey");
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   307
        
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   308
        // create
180
22967b165692 rename sock_ssl/sock_gnutls -> ssl/ssl_client
Tero Marttila <terom@fixme.fi>
parents: 145
diff changeset
   309
        if (ssl_client_cred_create(&net_info.ssl_cred, ssl_cafile, ssl_verify, ssl_cert, ssl_pkey, &err))
141
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   310
            return luaL_error(L, "sock_ssl_client_cred_create(ssl_cafile=%s, ssl_verify=%b, ssl_cert=%s, ssl_pkey=%s): %s", 
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   311
                    ssl_cafile, ssl_verify, ssl_cert, ssl_pkey, error_msg(&err)
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   312
                );
0b850238c588 implement SSL stuff for lua_client_connect
Tero Marttila <terom@fixme.fi>
parents: 131
diff changeset
   313
    }
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
    // create it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
    if (irc_client_add_net(lua_client->client, &net, &net_info, &err))
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
        return luaL_error(L, "irc_client_add_net: %s/%s: %s", net_info.network, net_info.hostname, error_msg(&err));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
    // wrap it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   320
    return lua_net_create(L, net);
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   323
static struct lua_func lua_client_get_network_func = LUA_FUNC(&lua_client_type, "network",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   324
        "Lookup an existing network by name",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   325
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   326
        LUA_FUNC_ARG_STRING("network",  LUA_ARG_STRING_REQUIRED)
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   327
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   328
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
static int lua_client_get_network (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   331
    struct lua_client *lua_client;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
    struct irc_net *net;
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   333
    const char *network;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   334
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   335
    // parse args
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   336
    lua_args_parse(L, &lua_client_get_network_func, (void *) &lua_client,
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   337
            &network
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   338
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
    
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
    // lookup the irc_net
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
    if ((net = irc_client_get_net(lua_client->client, network)) == NULL)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
        return luaL_error(L, "irc_client_get_net: no such network: %s", network);
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
    // wrap it
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
    return lua_net_create(L, net);
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   348
static struct lua_func lua_client_networks_func = LUA_FUNC(&lua_client_type, "channels",
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   349
        "Return an iterator over the client's networks",
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   350
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   351
        LUA_FUNC_ARG_END
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   352
    );
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   353
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   354
static int lua_client_networks_iter (lua_State *L)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   355
{
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   356
    int nargs = lua_gettop(L);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   357
    struct lua_client *lua_client = lua_arg_obj(L, nargs, 1, &lua_client_type, false);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   358
    struct lua_net *lua_net = lua_arg_obj(L, nargs, 2, &lua_net_type, true);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   359
    struct irc_net *net_next;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   360
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   361
    if (lua_net)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   362
        // return next
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   363
        net_next = TAILQ_NEXT(lua_net->net, client_networks);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   364
    else
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   365
        // return first
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   366
        net_next = TAILQ_FIRST(&lua_client->client->networks);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   367
    
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   368
    // build and return next value
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   369
    if (net_next)
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   370
        lua_net_create(L, net_next);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   371
    else
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   372
        lua_pushnil(L);
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   373
    
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   374
    return 1;
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   375
}
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   376
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   377
static int lua_client_networks (lua_State *L)
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   378
{
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   379
    struct lua_client *lua_client;
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   380
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   381
    // parse args
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   382
    lua_args_parse(L, &lua_client_networks_func, (void *) &lua_client);
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   383
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   384
    // push iter func
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   385
    lua_pushcfunction(L, lua_client_networks_iter);
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   386
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   387
    // push invariant state - the lua_client
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   388
    lua_pushvalue(L, 1);
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   389
199
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   390
    // return three-tuple
8eb839fbabba replace lua_client_networks/lua_network_channels with iterators
Tero Marttila <terom@fixme.fi>
parents: 198
diff changeset
   391
    return 2;
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   392
}
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   393
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   394
static struct lua_func lua_client_quit_func = LUA_FUNC(&lua_client_type, "quit",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   395
        "Disconnect from all networks",
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   396
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   397
        LUA_FUNC_ARG_STRING("message",  "Bye")
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   398
    );
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   399
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
static int lua_client_quit (lua_State *L)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   402
    struct lua_client *lua_client;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
    err_t err;
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   404
    const char *message;
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   405
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   406
    // parse args
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   407
    lua_args_parse(L, &lua_client_quit_func, (void *) &lua_client,
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   408
            &message
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   409
        );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
    // execute
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
    if ((err = irc_client_quit(lua_client->client, message)))
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
        return luaL_error(L, "irc_client_quit: %s", error_name(err));
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
    // ok
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
    return 0;
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   419
static struct lua_method lua_client_methods[] = LUA_METHODS(
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   420
        LUA_METHOD("set_defaults",  lua_client_set_defaults,    &lua_client_set_defaults_func   ),
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   421
        LUA_METHOD("connect",       lua_client_connect,         &lua_client_connect_func        ),
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   422
        LUA_METHOD("network",       lua_client_get_network,     &lua_client_get_network_func    ),
198
b74185e1357a implement lua_client_networks and lua_network_channels
Tero Marttila <terom@fixme.fi>
parents: 180
diff changeset
   423
        LUA_METHOD("networks",      lua_client_networks,        &lua_client_networks_func       ),
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   424
        LUA_METHOD("quit",          lua_client_quit,            &lua_client_quit_func           )
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   425
    );
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
void lua_irc_init (struct nexus_lua *lua)
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
{
145
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   429
    // register types
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   430
    lua_type_register(lua->st, &lua_chan_type, lua_chan_methods);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   431
    lua_type_register(lua->st, &lua_net_type, lua_net_methods);
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   432
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   433
    // register the global "client" object
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   434
    struct lua_client *lua_client = lua_type_register_global(lua->st, &lua_client_type, lua_client_methods, "client", sizeof(*lua_client));
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   435
    
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   436
    // initialize it
a5582e1a83da implement lua_type
Tero Marttila <terom@fixme.fi>
parents: 143
diff changeset
   437
    lua_client->client = lua->nexus->client;
116
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
}
92e71129074d split off lua_irc from lua_objs
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439