123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-"
- """
- NOINIW 2051 - by psy (epsylon@riseup.net)
- """
- import pygame
- import sys, os, random
- import data.levels.shell as shell
- import data.menu as menu
- import data.levels.level0.tree as tree
- def level0_shell(surface, WINDOW_SIZE, set_language, ACCESS_LEVEL, NETWORK_MACHINE_NUMBER, COLOR_WHITE, COLOR_BLACK, COLOR_BLUE, COLOR_GRAY, COLOR_YELLOW, COLOR_ORANGE, COLOR_GREEN):
- init(surface, WINDOW_SIZE, set_language, ACCESS_LEVEL, NETWORK_MACHINE_NUMBER, COLOR_WHITE, COLOR_BLACK, COLOR_BLUE, COLOR_GRAY, COLOR_YELLOW, COLOR_ORANGE, COLOR_GREEN)
- def init(surface, WINDOW_SIZE, set_language, ACCESS_LEVEL, NETWORK_MACHINE_NUMBER, COLOR_WHITE, COLOR_BLACK, COLOR_BLUE, COLOR_GRAY, COLOR_YELLOW, COLOR_ORANGE, COLOR_GREEN):
- CURRENT_LEVEL = 0 # set current level
- CURRENT_LANGUAGE = set_language # set current language
- ACCESS_LEVEL = str(ACCESS_LEVEL)
- NETWORK_MACHINE_NUMBER = str(NETWORK_MACHINE_NUMBER)
- width= WINDOW_SIZE[0]
- height = WINDOW_SIZE[1]
- fullLine = 18
- font_SHELL_type = "data/fonts/Vera.ttf"
- font_SHELL_size = 15
- myFont = pygame.font.Font(font_SHELL_type, font_SHELL_size) # create font object for SHELL
- listColor = [COLOR_WHITE, COLOR_BLUE, COLOR_GREEN, COLOR_YELLOW, COLOR_ORANGE]
- changeColor = 0
- showCur = 0
- colorCur = listColor.pop(listColor.index(random.choice(listColor)))
- content = []
- contentDisplay = []
- listCommand = []
- indexListCommand = 0
- contentLineCurrent = ''
- contentLineCurrentDisplay = '|'
- posCursor = 0
- currentLine = True
- root = ACCESS_LEVEL+'@'+NETWORK_MACHINE_NUMBER+':~% '
- camTop = 0
- camBot = 0
- line = 0
- mac_uname, mac_root, starting_position, files_tree, macs_tree = tree.init() # extracting basics from shell: uname, root, starting position, trees...
- current_position = starting_position
- def displayText(text, at, x, y, color, bg=None):
- if not ACCESS_LEVEL+'@'+NETWORK_MACHINE_NUMBER+':~% ' in text:
- label = myFont.render(text, at, COLOR_WHITE, bg)
- surface.blit(label, (x, y))
- else:
- labelUser = myFont.render(ACCESS_LEVEL+'@'+NETWORK_MACHINE_NUMBER, at, (COLOR_ORANGE), bg)
- labelColon = myFont.render(':', at, (COLOR_WHITE), bg)
- labelNS = myFont.render('%', at, (COLOR_WHITE), bg)
- labelTilde = myFont.render('~', at, (COLOR_BLUE), bg)
- surface.blit(labelUser, (0, y))
- surface.blit(labelColon, (105, y))
- surface.blit(labelTilde, (113, y))
- surface.blit(labelNS, (125, y))
- text = text.replace(ACCESS_LEVEL+'@'+NETWORK_MACHINE_NUMBER+':~%', '')
- labelText = myFont.render(text, at, color, bg)
- surface.blit(labelText, (135, y))
-
- def readChar():
- if event.key == pygame.K_BACKSPACE:
- return 'backspace'
- elif event.key == pygame.K_PAGEUP:
- return 'pageup'
- elif event.key == pygame.K_PAGEDOWN:
- return 'pagedown'
- elif event.key == pygame.K_TAB:
- return 'tab'
- elif event.key == pygame.K_RETURN:
- return 'enter'
- elif event.key == pygame.K_ESCAPE:
- return 'esc'
- elif event.key in (pygame.K_RSHIFT, pygame.K_LSHIFT):
- return 'shift'
- elif event.key in (pygame.K_RCTRL, pygame.K_LCTRL):
- return 'control'
- elif event.key == pygame.K_RIGHT:
- return 'kright'
- elif event.key == pygame.K_LEFT:
- return 'kleft'
- elif event.key == pygame.K_UP:
- return 'kup'
- elif event.key == pygame.K_DOWN:
- return 'kdown'
- elif event.key == pygame.K_CAPSLOCK:
- return None
- elif event.key == 283:
- return 'begincur'
- elif event.key == 284:
- return 'endcur'
- elif event.key == 285:
- return 'delall'
- else:
- return event.unicode
- def progressCommand(cmd, current_position):
- cmd = cmd.strip()
- if cmd == '':
- return []
- elif cmd == 'clear': # clear
- return []
- elif cmd == 'help': # help
- current_help = helpCommand()
- return current_position, current_help, True
- elif cmd == 'exit': # exit
- menu.main() # return to login menu
- elif cmd == 'pwd': # pwd
- current_path = shell.getPWD(current_position)
- return current_position, current_path, False
- elif cmd == 'ls' or cmd == 'dir': # ls/dir
- current_tree = shell.getList(mac_root, current_position, files_tree)
- return current_position, current_tree, False
- elif cmd == 'id': # id
- user_id = shell.getId(ACCESS_LEVEL)
- return current_position, user_id, False
- elif cmd == 'whois': # whois
- whois = shell.getId(ACCESS_LEVEL)
- return current_position, whois, False
- elif cmd == 'hostname': # hostname
- hostname = shell.getHostName(NETWORK_MACHINE_NUMBER)
- return current_position, hostname, False
- elif cmd == 'uname': # uname
- uname = shell.getUname(mac_uname)
- return current_position, uname, False
- elif cmd == "cd ..": # cd_up
- current_path = shell.getCdUP(mac_root, current_position)
- current_position = current_path
- return current_position, current_path, False
- elif cmd.startswith('cd '):
- direc = cmd[3:]
- direc = direc.strip()
- current_path = shell.changePWD(mac_root, current_position, files_tree, direc)
- current_position = current_path
- return current_position, current_path, False
- elif cmd.startswith('cat '):
- file_target = cmd[3:]
- file_target = file_target.strip()
- file_text = shell.getCAT(CURRENT_LANGUAGE, CURRENT_LEVEL, current_position, files_tree, file_target)
- return current_position, file_text, False
- elif cmd.startswith('install '):
- file_target = cmd[7:]
- file_target = file_target.strip()
- file_text = shell.installProgram(current_position, files_tree, file_target)
- return current_position, file_text, False
- elif cmd.startswith('connect '):
- file_target = cmd[7:]
- file_target = file_target.strip()
- file_text = shell.connectMac(current_position, macs_tree, file_target, surface, WINDOW_SIZE, CURRENT_LANGUAGE)
- return current_position, file_text, False
- elif cmd.startswith('disconnect'):
- menu.main() # return to login menu
- else:
- return current_position, 'y-shell: command not found: "'+ str(cmd)+'"', False
- def helpCommand():
- lstHelp = []
- m = open("data/levels/help.txt", "r")
- shell_help = m.readlines()
- m.close
- lstHelp.append("SHELL: "+str(shell.VERSION))
- lstHelp.append(" ")
- for text in shell_help:
- if CURRENT_LANGUAGE == "0": # English
- if text.startswith("ENGLISH"):
- lstHelp.append(str(text.split(":")[1].replace("\n","")))
- else: # Spanish
- if text.startswith("SPANISH"):
- lstHelp.append(str(text.split(":")[1].replace("\n","")))
- lstHelp.append(" ")
- return lstHelp
- # starting main() loop
- while 1:
- fullLine = (height - 120) // 20
- if currentLine:
- if camBot - camTop == (fullLine - 1):
- camBot = len(contentDisplay)
- camTop = camBot - (fullLine - 1)
- for event in pygame.event.get():
- if event.type == pygame.KEYDOWN:
- newChar = readChar()
- if newChar not in ('delall', 'begincur', 'endcur', 'backspace', 'tab', 'enter', 'esc', 'pageup', 'pagedown',\
- 'shift', 'control', None, 'kright', 'kleft', 'kup', 'kdown'):
- try:
- contentLineCurrent = list(contentLineCurrent)
- contentLineCurrent.insert(posCursor, newChar)
- contentLineCurrent = ''.join(contentLineCurrent)
- posCursor += 1
- lstChar = list(contentLineCurrent)
- lstChar.insert(posCursor, '|')
- contentLineCurrentDisplay = ''.join(lstChar)
- except:
- posCursor = 0
- if camBot - camTop == (fullLine - 1):
- camTop += 1
- camBot += 1
- content.append([root])
- contentLineCurrent = ''
- contentLineCurrentDisplay = '|'
- indexListCommand = 0
- showCur = 0
- currentLine = True
- elif newChar == 'delall':
- contentLineCurrent = ''
- posCursor = 0
- contentLineCurrentDisplay = '|'
- currentLine = True
- elif newChar == 'begincur':
- posCursor = 0
- contentLineCurrentDisplay = '|' + contentLineCurrent
- currentLine = True
- elif newChar == 'endcur':
- posCursor = len(contentLineCurrent)
- contentLineCurrentDisplay = contentLineCurrent + '|'
- currentLine = True
- elif newChar == 'pageup':
- if not len(listCommand) == 0:
- if -len(listCommand) != indexListCommand:
- indexListCommand -= 1
- contentLineCurrent = listCommand[indexListCommand]
- contentLineCurrentDisplay = contentLineCurrent + '|'
- posCursor = len(contentLineCurrent)
- currentLine = True
- showCur = 0
- elif newChar == 'pagedown':
- if not len(listCommand) == 0:
- if indexListCommand < -1:
- indexListCommand += 1
- contentLineCurrent = listCommand[indexListCommand]
- contentLineCurrentDisplay = contentLineCurrent + '|'
- posCursor = len(contentLineCurrent)
- currentLine = True
- showCur = 0
- elif newChar == 'kup':
- if camTop != 0:
- if camBot - camTop == (fullLine - 1):
- camBot -= 1
- camTop -= 1
- currentLine = False
- showCur = 0
- elif newChar == 'kdown':
- if camBot < len(contentDisplay):
- camBot += 1
- camTop += 1
- showCur = 0
- elif newChar == 'kright':
- if not len(contentLineCurrent) == posCursor:
- posCursor += 1
- lstChar = list(contentLineCurrent)
- lstChar.insert(posCursor, '|')
- contentLineCurrentDisplay = ''.join(lstChar)
- currentLine = True
- showCur = 0
- elif newChar == 'kleft':
- if posCursor != 0:
- posCursor -= 1
- lstChar = list(contentLineCurrent)
- lstChar.insert(posCursor, '|')
- contentLineCurrentDisplay = ''.join(lstChar)
- currentLine = True
- showCur = 0
- elif newChar == 'backspace':
- if len(contentLineCurrent) != 0 and posCursor != 0:
- try:
- contentLineCurrent = list(contentLineCurrent)
- wordPoped = contentLineCurrent.pop(posCursor - 1)
- contentLineCurrent = ''.join(contentLineCurrent)
- posCursor -= 1
- except:
- contentLineCurrent = contentLineCurrent[1:]
- posCursor = len(contentLineCurrent)
- lstChar = list(contentLineCurrent)
- lstChar.insert(posCursor, '|')
- contentLineCurrentDisplay = ''.join(lstChar)
- currentLine = True
- showCur = 0
- elif newChar == 'enter':
- currentLine = True
- indexListCommand = 0
- if camBot - camTop == (fullLine - 1):
- camTop += 1
- camBot += 1
- content.append([root + contentLineCurrent])
- if contentLineCurrent.strip() == 'clear':
- camTop = 0
- camBot = 0
- posCursor = 0
- content = []
- contentLineCurrent = ''
- contentLineCurrentDisplay = '|'
- else:
- current_position, contentAppend, help_mode = progressCommand(contentLineCurrent, current_position)
- if help_mode == False:
- content.append(contentAppend)
- else:
- for eachLine in contentAppend:
- if camBot - camTop == (fullLine - 1):
- camTop += 1
- camBot += 1
- content.append(eachLine)
- help_mode = False
- if len(contentLineCurrent.strip(' ')) != 0:
- listCommand.append(contentLineCurrent)
- posCursor = 0
- contentLineCurrent = ''
- contentLineCurrentDisplay = '|'
- showCur = 0
- surface.fill(COLOR_BLACK)
- changeColor += 1
- showCur += 1
- contentDisplay = []
- for i in range(len(content)):
- text = ''.join(content[i])
- if len(text) * 8 > width:
- while len(text) * 8 > width:
- textMini = text[:width // 8 - 1]
- contentDisplay.append(textMini)
- text = text[width // 8 - 1:]
- contentDisplay.append(text)
- else:
- contentDisplay.append(text)
- if currentLine:
- if len(contentDisplay) >= fullLine:
- camBot = len(contentDisplay)
- camTop = camBot - (fullLine - 1)
- else:
- camBot = len(contentDisplay)
- camTop = 0
- for i in range(camTop, camBot):
- displayText(contentDisplay[i], 1, 0, line * 20, COLOR_WHITE)
- line += 1
- if camBot == len(contentDisplay):
- if showCur < 500:
- displayText(root + contentLineCurrentDisplay, 1, 0, line * 20, COLOR_WHITE)
- else:
- displayText(root + contentLineCurrent, 1, 0, line * 20, COLOR_WHITE)
- if showCur > 1000:
- showCur = 0
- else:
- displayText(''.join(contentDisplay[camBot]), 1, 0, line * 20, COLOR_WHITE)
- line = 0
- pygame.display.flip()
|