This library wraps functionality of Internet cards. Also see the Internet Component for more low level functionality (such as querying availability of HTTP and TCP functionality).
internet.request(url: string[, data: string or table]): function
internet.request(url, {some = "variable", another = 1})
some=variable&another=1
.for line in internet.request(...) do stuff() end
os.sleep
, event.pull
or any other functions that directly or indirectly consume signals while iterating the result lines, since the lines of the response are one signal each (to avoid running out of memory for large results).
internet.socket(address:string[, port:number]):table
connect
method and wraps it in a table that provides the same methods as a file opened using filesystem.open
: read
, write
and close
(and seek
, which will always fail). It is recommended to use internet.open
instead, which will wrap the opened socket in a buffer, the same way io.open
wraps files.internet.open(address:string[, port:number]):table
s:read
and s:write
- in general it can be treated much like files opened using io.open
. It may often be desirable to set the buffer's read timeout using s:setTimeout(seconds)
, to avoid it blocking indefinitely.
The read method on the returned buffer is blocking. Read will wait until some data is available to be read and return that.local internet = require("internet") local handle = internet.open("example.com", 1337) local data = handle:read(10) handle:write("1234") handle:close()
This is an example of a basic IRC bot that echos back what you say to it, using the sockets in the internet api.
--this is just a basic split function we'll use to split the messages function split(data, pat) local ret = {} for i in string.gmatch(data,pat) do table.insert(ret,i) end return ret end --config local nickname = "myircbot" local channel = "#mybotchannel" local net = require("internet") local con = net.open("irc.esper.net",6667) --define server / port here, this will connect to the server if(con) then local line,png,linesplt,msgfrom = "" while(true) do line = con:read() --read a line from the socket print(line) linesplt = split(line,"[^:]+") if #linesplt >= 2 and string.find(linesplt[2], "No Ident response") ~= nil then print("JOIN") con:write("USER " .. nickname .. " 0 * :" .. nickname .. "\r\n") --con:write(msg) is used to send messages, con:read() will read a line con:write("NICK " .. nickname .. "\r\n") --for IRC, remember to append the \r\n on the end of all messages con:write("JOIN :" .. channel .. "\r\n") elseif linesplt[1] == "PING" or linesplt[1] == "PING " then print("PING") png = split(line,"[^:]+") con:write("PONG :"..png[#png].."\r\n") --respond to pings so we don't get disconnected elseif string.find(linesplt[1], "PRIVMSG #") ~= nil then msgfrom = split(linesplt[1],"[^ ]+") msgfrom = msgfrom[3] con:write("PRIVMSG "..msgfrom.." :"..linesplt[2].."\r\n") end end else print("Connection failed.") end
For a more advanced example, check out the IRC Client program available in the latest release of OpenComputers: irc.lua