-
Notifications
You must be signed in to change notification settings - Fork 435
API Internet
Vexatos edited this page Jul 13, 2014
·
11 revisions
For those that don't like images: the wiki has moved to a new place, http://ocdoc.cil.li/.
This wiki will no longer be updated.
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
Sends an HTTP request to the specified URL, with the specified POST data, if any. If no data is specified, a GET request will be made. The POST data can be in one of two formats: if it's a string, it will be sent as-is. If it's a table, it will be converted to a string by assuming that each key is the name of a POST variable, and it's associated value is the value for that variable. So, for example:
internet.request(url, {some = "variable", another = 1})
Will sendsome=variable&another=1
.
The returned function is an iterator over the lines of the result, use it like so:
for line in internet.request(...) do stuff() end
Important: you should not callos.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
Opens a TCP socket using an internet component'sconnect
method and wraps it in a table that provides the same methods as a file opened usingfilesystem.open
:read
,write
andclose
(andseek
, which will always fail). It is recommended to useinternet.open
instead, which will wrap the opened socket in a buffer, the same wayio.open
wraps files. -
internet.open(address:string[, port:number]):table
Opens a buffered socket stream to the specified address. The stream can be read from and written from, usings:read
ands:write
- in general it can be treated much like files opened usingio.open
. It may often be desirable to set the buffer's read timeout usings:setTimeout(seconds)
, to avoid it blocking indefinitely. Example usage:
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