CoderJohn

ComputerCraft Email Client - ENET

Nov 12th, 2012
1,311
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.59 KB | None | 0 0
  1. local logged_in = false;
  2. local width, height = term.getSize();
  3. local center = width/2;
  4. local user = {
  5.   Name = "";
  6. };
  7. local server = {
  8.   IP = -1;
  9. }
  10. local goldUser = term.isColor();
  11.  
  12. --term functions & locally assigning them prevents us from having to search them in term and
  13. --is more efficient
  14.   local twrite = term.write;
  15.   local tcolor = term.setTextColor;
  16.   local isColor = term.isColor;
  17.   local hasModem = false;
  18.   local scp = term.setCursorPos;
  19.   local clear = function() term.clear(); if(user.Name~="")then scp(width-#user.Name,height); tcolor(8); twrite(user.Name); end scp(1,1); end
  20.   local gcp = term.getCursorPos;
  21.   local tick = os.clock;
  22.  
  23. --graphic interface functions
  24.   function ui_list(items)
  25.     local interaction=true;
  26.     local change = true;
  27.     local selected=1;
  28.     local item;
  29.     while(interaction==true)do
  30.         if(change)then
  31.           clear();
  32.           for i=1,#items do
  33.             item = items[i];
  34.             if(selected == i)then
  35.               item = "< "..item.." >"
  36.             end
  37.             scp(width/2-#item/2,i+2);
  38.             write(item,8);
  39.           end
  40.           change = false;
  41.         end
  42.         local eventData = {os.pullEvent()};
  43.         local event = eventData[1];
  44.         if(event == 'key')then
  45.           local key = eventData[2];
  46.           if(key == 200)then --up key
  47.             if(selected~=1)then
  48.               selected = selected - 1;
  49.               change = true;
  50.             end
  51.           elseif(key == 208)then --down key
  52.             if(selected~=#items)then
  53.               selected = selected + 1;
  54.               change = true;
  55.             end
  56.           elseif(key == 28)then --enter key
  57.             return items[selected]
  58.           end
  59.         elseif(event == 'mouse_click')then
  60.           local y = eventData[4]-2;
  61.           if(y>=1 and y<=#items)then
  62.             if(y==selected)then
  63.               return items[selected];
  64.             else
  65.               selected = y;
  66.               change = true;
  67.             end
  68.           end
  69.         end
  70.     end
  71.   end
  72.  
  73. --define functions
  74.  
  75.   function waitForInput()
  76.     local event;
  77.     repeat
  78.       event = os.pullEvent();
  79.     until event == 'mouse_click' or event=='char' or event=='key'
  80.   end
  81.  
  82.   function write(text, color, ignore)
  83.     if(isColor)then
  84.       tcolor(color or 16);
  85.     end
  86.     twrite(text);
  87.     if(not ignore)then
  88.       scp(1,({gcp()})[2]+1);
  89.     end
  90.   end
  91.  
  92.   function getModem()
  93.     local sides = {"left","right","front","back","bottom","top"};
  94.     for i=1,#sides do
  95.       hasModem = (peripheral.isPresent(sides[i]) and peripheral.getType(sides[i])=='modem') or false;
  96.       if(hasModem)then
  97.         hasModem = sides[i];
  98.         return hasModem;
  99.       end
  100.     end
  101.   end
  102.  
  103.   function writeCentered(text, color, ignore)
  104.     text = tostring(text);
  105.     if(isColor)then
  106.       tcolor(color or 16);
  107.     end
  108.     scp(center-#text/2,({gcp()})[2]);
  109.     twrite(text);
  110.     if(not ignore)then
  111.       scp(1,({gcp()})[2]+1);
  112.     end
  113.   end
  114.  
  115.   function setY(y,inc)
  116.     if(inc)then
  117.       y = ({gcp()})[2]+y;
  118.     end
  119.     scp(1,y);
  120.   end
  121.  
  122.   function connect()
  123.     getModem();
  124.     if(not hasModem)then
  125.       clear();
  126.       write("ERROR: No Modem is connected!", 16384); --red
  127.       return false;
  128.     end
  129.     rednet.open(hasModem);
  130.     local id;
  131.     clear();
  132.     repeat
  133.       write("Enter the server computer's id!", 8);
  134.       write("ID: ", 8, true); --light blue
  135.       tcolor(16); --gold text
  136.       id=tonumber(io.read());
  137.       if(id==nil)then
  138.         clear();
  139.         write("ERROR: ID must be a number!", 16384); --red
  140.       end
  141.     until id~=nil
  142.   --send a message saying you want to connect
  143.     rednet.send(id, "connect");
  144.     local key, sender, response, distance;
  145.   --wait for the server to respond to you
  146.     local start = tick();
  147.     local timePassed=0;
  148.     local loading = {"0oo", "o0o", "oo0"};
  149.     local tp = -1;
  150.     local track = 0;
  151.     repeat
  152.       sender, response, distance = rednet.receive(.5);
  153.       timePassed = tick()-start;
  154.       if(timePassed-tp > 0.5)then
  155.         tp=timePassed;
  156.         track = track+1;
  157.         clear();
  158.         writeCentered("Loading "..loading[track%3+1],8);
  159.       end
  160.     until sender==id or timePassed >= 10
  161.  
  162.     if(sender~=id)then
  163.       clear();
  164.       write("ERROR: Failed to get a response!", 16384); --red
  165.       return false;
  166.     else
  167.       if(response:lower() == "handshake")then
  168.         clear();
  169.         rednet.send(id, "connected");
  170.         write("Connected to server: "..id, 8); --light blue
  171.         server.IP = id;
  172.         return true;
  173.       end
  174.     end
  175.   end
  176.  
  177. while(true)do
  178.   local list = {"Info","Connect"};
  179.   if(server.IP~=-1)then
  180.     list[2] = "Disconnect";
  181.     if(user.Name == "")then
  182.       list[3] = "Create an Account";
  183.       list[4] = "Login";
  184.     else
  185.       list[3] = "Log Out";
  186.       list[4] = "My Account";
  187.     end
  188.   end
  189.   local clicked = ui_list(list);
  190.   if(clicked=='Connect')then
  191.     if(not connect())then
  192.       if(hasModem)then
  193.         rednet.close(hasModem);
  194.       end
  195.     end
  196.     waitForInput();
  197.   elseif(clicked=='Disconnect')then
  198.     rednet.send(server.IP, "disconnect");
  199.     server.IP = -1;
  200.   elseif(clicked=='Create an Account')then
  201.     local username, password;
  202.     clear();
  203.     writeCentered("Account Creation",8);
  204.     write("Username: ",8,true);
  205.     username = io.read();
  206.     write("Password: ",8,true);
  207.     password = io.read();
  208.     local data = "*newaccount".."\28"..username.."\28"..password.."\28";
  209.     rednet.send(server.IP, data);
  210.     local sender,response = rednet.receive(10); clear();
  211.     if(response == 'success')then
  212.       writeCentered("Account Created!", 8);
  213.       user.Name = username;
  214.     else
  215.       writeCentered(response, 16384);
  216.     end
  217.     waitForInput();
  218.   elseif(clicked=='Log Out')then
  219.     user.Name = "";
  220.     rednet.send(server.IP, "logout");
  221.   elseif(clicked=='Login')then
  222.     local username, password;
  223.     clear();
  224.     writeCentered("Account Login",8);
  225.     write("Username: ",8,true);
  226.     username = io.read();
  227.     write("Password: ",8,true);
  228.     password = io.read();
  229.     local data = "*loginaccount".."\28"..username.."\28"..password.."\28";
  230.     rednet.send(server.IP, data);
  231.     local sender, response = rednet.receive(10); clear();
  232.     if(response == 'success')then
  233.       writeCentered("Logged In!", 8);
  234.       user.Name = username;
  235.     else
  236.       writeCentered(response, 16384);
  237.     end
  238.     waitForInput();
  239.   elseif(clicked=='Info')then
  240.     clear();
  241.     writeCentered("Info",8);
  242.     setY(2,true);
  243.     write("Author: ENET",8);
  244.     write("Published: 11/12/12",8);
  245.     write("Usage: Free",8);
  246.     waitForInput();
  247.   end
  248. end
Advertisement
Add Comment
Please, Sign In to add comment