Internet API

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[, headers: 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 send some=variable&another=1.
    The returned function is an iterator over chunks of the result, use it like so:
    for chunk in internet.request(...) do stuff() end
  • internet.socket(address:string[, port:number]):table
    Opens a TCP socket using an internet component's 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.
    The read method on the returned socket is non-blocking. Read will instantly return, but may return an empty string if there is nothing to read. Write may block until all data has been successfully written. It'll usually return immediately, though.
  • 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, using 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.
    Example usage:
snippet.lua
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.

snippet.lua
--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

Contents