Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local logged_in = false;
- local width, height = term.getSize();
- local center = width/2;
- local user = {
- Name = "";
- };
- local server = {
- IP = -1;
- }
- local goldUser = term.isColor();
- --term functions & locally assigning them prevents us from having to search them in term and
- --is more efficient
- local twrite = term.write;
- local tcolor = term.setTextColor;
- local isColor = term.isColor;
- local hasModem = false;
- local scp = term.setCursorPos;
- local clear = function() term.clear(); if(user.Name~="")then scp(width-#user.Name,height); tcolor(8); twrite(user.Name); end scp(1,1); end
- local gcp = term.getCursorPos;
- local tick = os.clock;
- --graphic interface functions
- function ui_list(items)
- local interaction=true;
- local change = true;
- local selected=1;
- local item;
- while(interaction==true)do
- if(change)then
- clear();
- for i=1,#items do
- item = items[i];
- if(selected == i)then
- item = "< "..item.." >"
- end
- scp(width/2-#item/2,i+2);
- write(item,8);
- end
- change = false;
- end
- local eventData = {os.pullEvent()};
- local event = eventData[1];
- if(event == 'key')then
- local key = eventData[2];
- if(key == 200)then --up key
- if(selected~=1)then
- selected = selected - 1;
- change = true;
- end
- elseif(key == 208)then --down key
- if(selected~=#items)then
- selected = selected + 1;
- change = true;
- end
- elseif(key == 28)then --enter key
- return items[selected]
- end
- elseif(event == 'mouse_click')then
- local y = eventData[4]-2;
- if(y>=1 and y<=#items)then
- if(y==selected)then
- return items[selected];
- else
- selected = y;
- change = true;
- end
- end
- end
- end
- end
- --define functions
- function waitForInput()
- local event;
- repeat
- event = os.pullEvent();
- until event == 'mouse_click' or event=='char' or event=='key'
- end
- function write(text, color, ignore)
- if(isColor)then
- tcolor(color or 16);
- end
- twrite(text);
- if(not ignore)then
- scp(1,({gcp()})[2]+1);
- end
- end
- function getModem()
- local sides = {"left","right","front","back","bottom","top"};
- for i=1,#sides do
- hasModem = (peripheral.isPresent(sides[i]) and peripheral.getType(sides[i])=='modem') or false;
- if(hasModem)then
- hasModem = sides[i];
- return hasModem;
- end
- end
- end
- function writeCentered(text, color, ignore)
- text = tostring(text);
- if(isColor)then
- tcolor(color or 16);
- end
- scp(center-#text/2,({gcp()})[2]);
- twrite(text);
- if(not ignore)then
- scp(1,({gcp()})[2]+1);
- end
- end
- function setY(y,inc)
- if(inc)then
- y = ({gcp()})[2]+y;
- end
- scp(1,y);
- end
- function connect()
- getModem();
- if(not hasModem)then
- clear();
- write("ERROR: No Modem is connected!", 16384); --red
- return false;
- end
- rednet.open(hasModem);
- local id;
- clear();
- repeat
- write("Enter the server computer's id!", 8);
- write("ID: ", 8, true); --light blue
- tcolor(16); --gold text
- id=tonumber(io.read());
- if(id==nil)then
- clear();
- write("ERROR: ID must be a number!", 16384); --red
- end
- until id~=nil
- --send a message saying you want to connect
- rednet.send(id, "connect");
- local key, sender, response, distance;
- --wait for the server to respond to you
- local start = tick();
- local timePassed=0;
- local loading = {"0oo", "o0o", "oo0"};
- local tp = -1;
- local track = 0;
- repeat
- sender, response, distance = rednet.receive(.5);
- timePassed = tick()-start;
- if(timePassed-tp > 0.5)then
- tp=timePassed;
- track = track+1;
- clear();
- writeCentered("Loading "..loading[track%3+1],8);
- end
- until sender==id or timePassed >= 10
- if(sender~=id)then
- clear();
- write("ERROR: Failed to get a response!", 16384); --red
- return false;
- else
- if(response:lower() == "handshake")then
- clear();
- rednet.send(id, "connected");
- write("Connected to server: "..id, 8); --light blue
- server.IP = id;
- return true;
- end
- end
- end
- while(true)do
- local list = {"Info","Connect"};
- if(server.IP~=-1)then
- list[2] = "Disconnect";
- if(user.Name == "")then
- list[3] = "Create an Account";
- list[4] = "Login";
- else
- list[3] = "Log Out";
- list[4] = "My Account";
- end
- end
- local clicked = ui_list(list);
- if(clicked=='Connect')then
- if(not connect())then
- if(hasModem)then
- rednet.close(hasModem);
- end
- end
- waitForInput();
- elseif(clicked=='Disconnect')then
- rednet.send(server.IP, "disconnect");
- server.IP = -1;
- elseif(clicked=='Create an Account')then
- local username, password;
- clear();
- writeCentered("Account Creation",8);
- write("Username: ",8,true);
- username = io.read();
- write("Password: ",8,true);
- password = io.read();
- local data = "*newaccount".."\28"..username.."\28"..password.."\28";
- rednet.send(server.IP, data);
- local sender,response = rednet.receive(10); clear();
- if(response == 'success')then
- writeCentered("Account Created!", 8);
- user.Name = username;
- else
- writeCentered(response, 16384);
- end
- waitForInput();
- elseif(clicked=='Log Out')then
- user.Name = "";
- rednet.send(server.IP, "logout");
- elseif(clicked=='Login')then
- local username, password;
- clear();
- writeCentered("Account Login",8);
- write("Username: ",8,true);
- username = io.read();
- write("Password: ",8,true);
- password = io.read();
- local data = "*loginaccount".."\28"..username.."\28"..password.."\28";
- rednet.send(server.IP, data);
- local sender, response = rednet.receive(10); clear();
- if(response == 'success')then
- writeCentered("Logged In!", 8);
- user.Name = username;
- else
- writeCentered(response, 16384);
- end
- waitForInput();
- elseif(clicked=='Info')then
- clear();
- writeCentered("Info",8);
- setY(2,true);
- write("Author: ENET",8);
- write("Published: 11/12/12",8);
- write("Usage: Free",8);
- waitForInput();
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment