mirror of
https://github.com/jayofelony/pwnagotchi.git
synced 2025-07-01 18:37:27 -04:00
@ -11,6 +11,9 @@
|
||||
#
|
||||
# By default this script does nothing.
|
||||
# Powersave (Disable HDMI) ~30ma
|
||||
/opt/vc/bin/tvservice -o
|
||||
sleep 10
|
||||
if ! /opt/vc/bin/tvservice -s | grep HDMI; then
|
||||
/opt/vc/bin/tvservice -o
|
||||
fi
|
||||
/root/pwnagotchi/scripts/startup.sh &
|
||||
exit 0
|
||||
|
@ -2,6 +2,8 @@
|
||||
main:
|
||||
# currently implemented: en (default), de, nl, it
|
||||
lang: en
|
||||
# custom plugins path, if null only default plugins with be loaded
|
||||
plugins: null
|
||||
# monitor interface to use
|
||||
iface: mon0
|
||||
# command to run to bring the mon interface up in case it's not up already
|
||||
@ -21,7 +23,7 @@ main:
|
||||
|
||||
ai:
|
||||
# if false, only the default 'personality' will be used
|
||||
enabled: true
|
||||
enabled: false
|
||||
path: /root/brain.nn
|
||||
# 1.0 - laziness = probability of start training
|
||||
laziness: 0.1
|
||||
@ -89,7 +91,10 @@ personality:
|
||||
|
||||
# ui configuration
|
||||
ui:
|
||||
# ePaper display can update every 3 secs anyway
|
||||
# ePaper display can update every 3 secs anyway, set to 0 to only refresh for major data changes
|
||||
# IMPORTANT: The lifespan of an eINK display depends on the cumulative amount of refreshes. If you want to
|
||||
# preserve your display over time, you should set this value to 0.0 so that the display will be refreshed only
|
||||
# if any of the important data fields changed (the uptime and blinking cursor won't trigger a refresh).
|
||||
fps: 0.3
|
||||
display:
|
||||
enabled: true
|
||||
|
@ -9,9 +9,4 @@ do
|
||||
done
|
||||
|
||||
echo 0 >/sys/class/leds/led0/brightness
|
||||
sleep 0.3
|
||||
|
||||
# Powersave options
|
||||
# Disable power LED ~30ma
|
||||
echo none >/sys/class/leds/led0/trigger
|
||||
echo 1 >/sys/class/leds/led0/brightness
|
||||
sleep 0.3
|
@ -5,7 +5,7 @@ import time
|
||||
import traceback
|
||||
|
||||
import core
|
||||
import pwnagotchi
|
||||
import pwnagotchi, pwnagotchi.plugins as plugins
|
||||
|
||||
from pwnagotchi.log import SessionParser
|
||||
from pwnagotchi.voice import Voice
|
||||
@ -25,39 +25,49 @@ args = parser.parse_args()
|
||||
if args.do_clear:
|
||||
print("clearing the display ...")
|
||||
with open(args.config, 'rt') as fp:
|
||||
config = yaml.safe_load(fp)
|
||||
cleardisplay=config['ui']['display']['type']
|
||||
if cleardisplay in ('inkyphat', 'inky'):
|
||||
print("inky display")
|
||||
from inky import InkyPHAT
|
||||
epd = InkyPHAT(config['ui']['display']['color'])
|
||||
epd.set_border(InkyPHAT.BLACK)
|
||||
self._render_cb = self._inky_render
|
||||
elif cleardisplay in ('papirus', 'papi'):
|
||||
print("papirus display")
|
||||
from pwnagotchi.ui.papirus.epd import EPD
|
||||
os.environ['EPD_SIZE'] = '2.0'
|
||||
epd = EPD()
|
||||
epd.clear()
|
||||
elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'):
|
||||
print("waveshare v1 display")
|
||||
from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD
|
||||
epd = EPD()
|
||||
epd.init(epd.lut_full_update)
|
||||
epd.Clear(0xFF)
|
||||
elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'):
|
||||
print("waveshare v2 display")
|
||||
from pwnagotchi.ui.waveshare.v2.waveshare import EPD
|
||||
epd = EPD()
|
||||
epd.init(epd.FULL_UPDATE)
|
||||
epd.Clear(0xff)
|
||||
else:
|
||||
print("unknown display type %s" % cleardisplay)
|
||||
quit()
|
||||
config = yaml.safe_load(fp)
|
||||
cleardisplay = config['ui']['display']['type']
|
||||
if cleardisplay in ('inkyphat', 'inky'):
|
||||
print("inky display")
|
||||
from inky import InkyPHAT
|
||||
|
||||
epd = InkyPHAT(config['ui']['display']['color'])
|
||||
epd.set_border(InkyPHAT.BLACK)
|
||||
self._render_cb = self._inky_render
|
||||
elif cleardisplay in ('papirus', 'papi'):
|
||||
print("papirus display")
|
||||
from pwnagotchi.ui.papirus.epd import EPD
|
||||
|
||||
os.environ['EPD_SIZE'] = '2.0'
|
||||
epd = EPD()
|
||||
epd.clear()
|
||||
elif cleardisplay in ('waveshare_1', 'ws_1', 'waveshare1', 'ws1'):
|
||||
print("waveshare v1 display")
|
||||
from pwnagotchi.ui.waveshare.v1.epd2in13 import EPD
|
||||
|
||||
epd = EPD()
|
||||
epd.init(epd.lut_full_update)
|
||||
epd.Clear(0xFF)
|
||||
elif cleardisplay in ('waveshare_2', 'ws_2', 'waveshare2', 'ws2'):
|
||||
print("waveshare v2 display")
|
||||
from pwnagotchi.ui.waveshare.v2.waveshare import EPD
|
||||
|
||||
epd = EPD()
|
||||
epd.init(epd.FULL_UPDATE)
|
||||
epd.Clear(0xff)
|
||||
else:
|
||||
print("unknown display type %s" % cleardisplay)
|
||||
quit()
|
||||
|
||||
with open(args.config, 'rt') as fp:
|
||||
config = yaml.safe_load(fp)
|
||||
|
||||
plugins.load_from_path(plugins.default_path)
|
||||
if 'plugins' in config['main'] and config['main']['plugins'] is not None:
|
||||
plugins.load_from_path(config['main']['plugins'])
|
||||
|
||||
plugins.on('loaded')
|
||||
|
||||
display = Display(config=config, state={'name': '%s>' % pwnagotchi.name()})
|
||||
agent = Agent(view=display, config=config)
|
||||
|
||||
@ -65,6 +75,9 @@ core.log("%s@%s (v%s)" % (pwnagotchi.name(), agent._identity, pwnagotchi.version
|
||||
# for key, value in config['personality'].items():
|
||||
# core.log(" %s: %s" % (key, value))
|
||||
|
||||
for _, plugin in plugins.loaded.items():
|
||||
core.log("plugin '%s' v%s loaded from %s" % (plugin.__name__, plugin.__version__, plugin.__file__))
|
||||
|
||||
if args.do_manual:
|
||||
core.log("entering manual mode ...")
|
||||
|
||||
@ -112,13 +125,15 @@ core.logfile = config['main']['log']
|
||||
|
||||
agent.start_ai()
|
||||
agent.setup_events()
|
||||
agent.set_ready()
|
||||
agent.set_starting()
|
||||
agent.start_monitor_mode()
|
||||
agent.start_event_polling()
|
||||
|
||||
# print initial stats
|
||||
agent.next_epoch()
|
||||
|
||||
agent.set_ready()
|
||||
|
||||
while True:
|
||||
try:
|
||||
# recon on all channels
|
||||
|
@ -1,7 +1,5 @@
|
||||
import subprocess
|
||||
|
||||
version = '1.0.0a'
|
||||
|
||||
_name = None
|
||||
|
||||
|
||||
|
@ -8,6 +8,7 @@ import _thread
|
||||
|
||||
import core
|
||||
|
||||
import pwnagotchi.plugins as plugins
|
||||
from bettercap.client import Client
|
||||
from pwnagotchi.mesh.utils import AsyncAdvertiser
|
||||
from pwnagotchi.ai.train import AsyncTrainer
|
||||
@ -44,32 +45,41 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
pass
|
||||
return False
|
||||
|
||||
def config(self):
|
||||
return self._config
|
||||
|
||||
def supported_channels(self):
|
||||
return self._supported_channels
|
||||
|
||||
def on_ai_ready(self):
|
||||
self._view.on_ai_ready()
|
||||
def set_starting(self):
|
||||
self._view.on_starting()
|
||||
|
||||
def set_ready(self):
|
||||
self._view.on_starting()
|
||||
plugins.on('ready', self)
|
||||
|
||||
def set_free_channel(self, channel):
|
||||
self._view.on_free_channel(channel)
|
||||
plugins.on('free_channel', self, channel)
|
||||
|
||||
def set_bored(self):
|
||||
self._view.on_bored()
|
||||
plugins.on('bored', self)
|
||||
|
||||
def set_sad(self):
|
||||
self._view.on_sad()
|
||||
plugins.on('sad', self)
|
||||
|
||||
def set_excited(self):
|
||||
self._view.on_excited()
|
||||
plugins.on('excited', self)
|
||||
|
||||
def set_lonely(self):
|
||||
self._view.on_lonely()
|
||||
plugins.on('lonely', self)
|
||||
|
||||
def set_rebooting(self):
|
||||
self._view.on_rebooting()
|
||||
plugins.on('rebooting', self)
|
||||
|
||||
def setup_events(self):
|
||||
core.log("connecting to %s ..." % self.url)
|
||||
@ -128,6 +138,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
self.start_advertising()
|
||||
|
||||
def wait_for(self, t, sleeping=True):
|
||||
plugins.on('sleep' if sleeping else 'wait', self, t)
|
||||
self._view.wait(t, sleeping)
|
||||
self._epoch.track(sleep=True, inc=t)
|
||||
|
||||
@ -179,6 +190,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
|
||||
def set_access_points(self, aps):
|
||||
self._access_points = aps
|
||||
plugins.on('wifi_update', self, aps)
|
||||
self._epoch.observe(aps, self._advertiser.peers() if self._advertiser is not None else ())
|
||||
return self._access_points
|
||||
|
||||
@ -327,6 +339,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
|
||||
try:
|
||||
for h in [e for e in self.events() if e['tag'] == 'wifi.client.handshake']:
|
||||
filename = h['data']['file']
|
||||
sta_mac = h['data']['station']
|
||||
ap_mac = h['data']['ap']
|
||||
key = "%s -> %s" % (sta_mac, ap_mac)
|
||||
@ -334,18 +347,20 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
if key not in self._handshakes:
|
||||
self._handshakes[key] = h
|
||||
new_shakes += 1
|
||||
apsta = self._find_ap_sta_in(sta_mac, ap_mac, s)
|
||||
if apsta is None:
|
||||
ap_and_station = self._find_ap_sta_in(sta_mac, ap_mac, s)
|
||||
if ap_and_station is None:
|
||||
core.log("!!! captured new handshake: %s !!!" % key)
|
||||
self._last_pwnd = ap_mac
|
||||
plugins.on('handshake', self, filename, ap_mac, sta_mac)
|
||||
else:
|
||||
(ap, sta) = apsta
|
||||
(ap, sta) = ap_and_station
|
||||
self._last_pwnd = ap['hostname'] if ap['hostname'] != '' and ap[
|
||||
'hostname'] != '<hidden>' else ap_mac
|
||||
core.log("!!! captured new handshake on channel %d: %s (%s) -> %s [%s (%s)] !!!" % ( \
|
||||
ap['channel'],
|
||||
sta['mac'], sta['vendor'],
|
||||
ap['hostname'], ap['mac'], ap['vendor']))
|
||||
plugins.on('handshake', self, filename, ap, sta)
|
||||
|
||||
except Exception as e:
|
||||
core.log("error: %s" % e)
|
||||
@ -419,6 +434,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
except Exception as e:
|
||||
self._on_error(ap['mac'], e)
|
||||
|
||||
plugins.on('association', self, ap)
|
||||
if throttle > 0:
|
||||
time.sleep(throttle)
|
||||
self._view.on_normal()
|
||||
@ -439,6 +455,7 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
except Exception as e:
|
||||
self._on_error(sta['mac'], e)
|
||||
|
||||
plugins.on('deauthentication', self, ap, sta)
|
||||
if throttle > 0:
|
||||
time.sleep(throttle)
|
||||
self._view.on_normal()
|
||||
@ -470,6 +487,9 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
self._current_channel = channel
|
||||
self._epoch.track(hop=True)
|
||||
self._view.set('channel', '%d' % channel)
|
||||
|
||||
plugins.on('channel_hop', self, channel)
|
||||
|
||||
except Exception as e:
|
||||
core.log("error: %s" % e)
|
||||
|
||||
@ -509,6 +529,8 @@ class Agent(Client, AsyncAdvertiser, AsyncTrainer):
|
||||
core.log("%d epochs with activity -> excited" % self._epoch.active_for)
|
||||
self.set_excited()
|
||||
|
||||
plugins.on('epoch', self, self._epoch.epoch - 1, self._epoch.data())
|
||||
|
||||
if self._epoch.blind_for >= self._config['main']['mon_max_blind_epochs']:
|
||||
core.log("%d epochs without visible access points -> rebooting ..." % self._epoch.blind_for)
|
||||
self._reboot()
|
||||
|
@ -7,6 +7,7 @@ import pwnagotchi.mesh.wifi as wifi
|
||||
|
||||
from pwnagotchi.ai.reward import RewardFunction
|
||||
|
||||
|
||||
class Epoch(object):
|
||||
def __init__(self, config):
|
||||
self.epoch = 0
|
||||
@ -92,7 +93,8 @@ class Epoch(object):
|
||||
try:
|
||||
peers_per_chan[peer.last_channel - 1] += 1.0
|
||||
except IndexError as e:
|
||||
core.log("got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels))
|
||||
core.log(
|
||||
"got peer data on channel %d, we can store %d channels" % (peer.last_channel, wifi.NumChannels))
|
||||
|
||||
# normalize
|
||||
aps_per_chan = [e / num_aps for e in aps_per_chan]
|
||||
|
@ -7,6 +7,7 @@ import json
|
||||
|
||||
import core
|
||||
|
||||
import pwnagotchi.plugins as plugins
|
||||
import pwnagotchi.ai as ai
|
||||
from pwnagotchi.ai.epoch import Epoch
|
||||
|
||||
@ -68,14 +69,14 @@ class Stats(object):
|
||||
core.log("[ai] saving %s" % self.path)
|
||||
|
||||
data = json.dumps({
|
||||
'born_at': self.born_at,
|
||||
'epochs_lived': self.epochs_lived,
|
||||
'epochs_trained': self.epochs_trained,
|
||||
'rewards': {
|
||||
'best': self.best_reward,
|
||||
'worst': self.worst_reward
|
||||
}
|
||||
})
|
||||
'born_at': self.born_at,
|
||||
'epochs_lived': self.epochs_lived,
|
||||
'epochs_trained': self.epochs_trained,
|
||||
'rewards': {
|
||||
'best': self.best_reward,
|
||||
'worst': self.worst_reward
|
||||
}
|
||||
})
|
||||
|
||||
temp = "%s.tmp" % self.path
|
||||
with open(temp, 'wt') as fp:
|
||||
@ -98,6 +99,11 @@ class AsyncTrainer(object):
|
||||
self._is_training = training
|
||||
self._training_epochs = for_epochs
|
||||
|
||||
if training:
|
||||
plugins.on('ai_training_start', self, for_epochs)
|
||||
else:
|
||||
plugins.on('ai_training_end', self)
|
||||
|
||||
def is_training(self):
|
||||
return self._is_training
|
||||
|
||||
@ -123,8 +129,10 @@ class AsyncTrainer(object):
|
||||
|
||||
def on_ai_training_step(self, _locals, _globals):
|
||||
self._model.env.render()
|
||||
plugins.on('ai_training_step', self, _locals, _globals)
|
||||
|
||||
def on_ai_policy(self, new_params):
|
||||
plugins.on('ai_policy', self, new_params)
|
||||
core.log("[ai] setting new policy:")
|
||||
for name, value in new_params.items():
|
||||
if name in self._config['personality']:
|
||||
@ -139,13 +147,19 @@ class AsyncTrainer(object):
|
||||
self.run('set wifi.sta.ttl %d' % self._config['personality']['sta_ttl'])
|
||||
self.run('set wifi.rssi.min %d' % self._config['personality']['min_rssi'])
|
||||
|
||||
def on_ai_ready(self):
|
||||
self._view.on_ai_ready()
|
||||
plugins.on('ai_ready', self)
|
||||
|
||||
def on_ai_best_reward(self, r):
|
||||
core.log("[ai] best reward so far: %s" % r)
|
||||
self._view.on_motivated(r)
|
||||
plugins.on('ai_best_reward', self, r)
|
||||
|
||||
def on_ai_worst_reward(self, r):
|
||||
core.log("[ai] worst reward so far: %s" % r)
|
||||
self._view.on_demotivated(r)
|
||||
plugins.on('ai_worst_reward', self, r)
|
||||
|
||||
def _ai_worker(self):
|
||||
self._model = ai.load(self._config, self, self._epoch)
|
||||
|
Binary file not shown.
@ -1,14 +1,13 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
# German language
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# dadav <33197631+dadav@users.noreply.github.com>, 2019.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-29 13:34+0200\n"
|
||||
"POT-Creation-Date: 2019-10-03 12:22+0200\n"
|
||||
"PO-Revision-Date: 2019-09-29 14:00+0200\n"
|
||||
"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language-Team: DE <33197631+dadav@users.noreply.github.com>\n"
|
||||
@ -17,28 +16,19 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:16
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:21
|
||||
msgid ""
|
||||
"Hi, I'm Pwnagotchi!\n"
|
||||
"Starting ..."
|
||||
msgstr ""
|
||||
"Hi, ich bin\n"
|
||||
"ein Pwnagotchi!\n"
|
||||
"Starte ..."
|
||||
|
||||
#: voice.py:22
|
||||
msgid ""
|
||||
"New day, new hunt,\n"
|
||||
"new pwns!"
|
||||
msgstr ""
|
||||
"Neuer Tag, neue Jagd,\n"
|
||||
"neue Pwns!"
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr "Hi, ich bin ein Pwnagotchi! Starte ..."
|
||||
|
||||
#: voice.py:23
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr "Neuer Tag, neue Jagd, neue Pwns!"
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Hack den Planet!"
|
||||
|
||||
@ -47,298 +37,202 @@ msgid "AI ready."
|
||||
msgstr "KI bereit."
|
||||
|
||||
#: voice.py:29
|
||||
msgid ""
|
||||
"The neural network\n"
|
||||
"is ready."
|
||||
msgstr ""
|
||||
"Das neurale Netz\n"
|
||||
"ist bereit."
|
||||
msgid "The neural network is ready."
|
||||
msgstr "Das neurale Netz ist bereit."
|
||||
|
||||
#: voice.py:39
|
||||
#: voice.py:37
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey, channel {channel} is\n"
|
||||
"free! Your AP will\n"
|
||||
"say thanks."
|
||||
msgstr ""
|
||||
"Hey, Channel {channel} ist\n"
|
||||
"frei! Dein AP wird\n"
|
||||
"es dir danken."
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr "Hey, Channel {channel} ist frei! Dein AP wir des dir danken."
|
||||
|
||||
#: voice.py:44
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Mir ist langweilig..."
|
||||
|
||||
#: voice.py:45
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Lass uns laufen gehen!"
|
||||
|
||||
#: voice.py:49
|
||||
msgid ""
|
||||
"This is the best\n"
|
||||
"day of my life!"
|
||||
msgstr ""
|
||||
"Das ist der beste\n"
|
||||
"Tag meines Lebens."
|
||||
#: voice.py:45
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr "Das ist der beste Tag meines Lebens."
|
||||
|
||||
#: voice.py:53
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Scheis Tag :/"
|
||||
|
||||
#: voice.py:58
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr "Mir ist sau langweilig..."
|
||||
|
||||
#: voice.py:59
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Ich bin sehr traurig..."
|
||||
|
||||
#: voice.py:60
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr "Ich bin traurig"
|
||||
|
||||
#: voice.py:66
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Ich lebe das Leben!"
|
||||
|
||||
#: voice.py:67
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Ich pwne, also bin ich."
|
||||
|
||||
#: voice.py:68
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr "So viele Netwerke!!!"
|
||||
|
||||
#: voice.py:69
|
||||
msgid ""
|
||||
"I'm having so much\n"
|
||||
"fun!"
|
||||
msgstr ""
|
||||
"Ich habe sooo viel\n"
|
||||
"Spaß!"
|
||||
#: voice.py:62
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr "Ich habe sooo viel Spaß!"
|
||||
|
||||
#: voice.py:70
|
||||
msgid ""
|
||||
"My crime is that of\n"
|
||||
"curiosity ..."
|
||||
msgstr ""
|
||||
"Mein Verbrechen ist\n"
|
||||
"das der Neugier ..."
|
||||
#: voice.py:63
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr "Mein Verbrechen ist das der Neugier ..."
|
||||
|
||||
#: voice.py:75
|
||||
#: voice.py:67
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello\n"
|
||||
"{name}!\n"
|
||||
"Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
"Hallo {name},\n"
|
||||
"Nett Dich\n"
|
||||
"kennenzulernen."
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr "Hallo {name}, nett Dich kennenzulernen."
|
||||
|
||||
#: voice.py:76
|
||||
#: voice.py:68
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is nearby! {name}"
|
||||
msgstr ""
|
||||
"Gerät {name}\n"
|
||||
"ist in der\n"
|
||||
"nähe!!"
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr "Gerät {name} ist in der nähe!!"
|
||||
|
||||
#: voice.py:81
|
||||
#: voice.py:72
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Uhm ...\n"
|
||||
"goodbye\n"
|
||||
"{name}"
|
||||
msgstr ""
|
||||
"Uhm ...\n"
|
||||
"tschüß\n"
|
||||
"{name}"
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr "Uhm ...tschüß {name}"
|
||||
|
||||
#: voice.py:82
|
||||
#: voice.py:73
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"is gone ..."
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"ist weg ..."
|
||||
msgid "{name} is gone ..."
|
||||
msgstr "{name} ist weg ..."
|
||||
|
||||
#: voice.py:87
|
||||
#: voice.py:77
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"is gone."
|
||||
msgstr ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"ist weg."
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr "Whoops ...{name} ist weg."
|
||||
|
||||
#: voice.py:88
|
||||
#: voice.py:78
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"missed!"
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"verpasst!"
|
||||
msgid "{name} missed!"
|
||||
msgstr "{name} verpasst!"
|
||||
|
||||
#: voice.py:89
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr "Verpasst!"
|
||||
|
||||
#: voice.py:94
|
||||
msgid ""
|
||||
"Nobody wants to\n"
|
||||
"play with me ..."
|
||||
msgstr ""
|
||||
"Niemand will mit\n"
|
||||
"mir spielen ..."
|
||||
#: voice.py:83
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr "Niemand will mit mir spielen ..."
|
||||
|
||||
#: voice.py:95
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr ""
|
||||
"Ich fühl mich\n"
|
||||
"so alleine ..."
|
||||
msgstr "Ich fühl michso alleine ..."
|
||||
|
||||
#: voice.py:96
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Wo sind denn alle?"
|
||||
|
||||
#: voice.py:101
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Schlafe für {secs}s"
|
||||
|
||||
#: voice.py:102
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:103
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "Warte für {secs}s ..."
|
||||
|
||||
#: voice.py:114
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Schaue mich um ({secs}s)"
|
||||
|
||||
#: voice.py:106
|
||||
#, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr "Hey {what}, lass uns Freunde sein!"
|
||||
|
||||
#: voice.py:107
|
||||
#, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr "Verbinde mit {what}"
|
||||
|
||||
#: voice.py:108
|
||||
#, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr "Ich denke, dass {mac} kein WiFi brauch!"
|
||||
|
||||
#: voice.py:113
|
||||
#, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr "Deauthentifiziere {mac}"
|
||||
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr "Kicke {mac}!"
|
||||
|
||||
#: voice.py:118
|
||||
#, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr "Cool, wir haben {num} neue Handshake{plural}!"
|
||||
|
||||
#: voice.py:121
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"let's be friends!"
|
||||
msgstr ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"lass uns Freunde sein!"
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr "Ops, da ist etwas schief gelaufen ...Starte neu ..."
|
||||
|
||||
#: voice.py:122
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Associating to\n"
|
||||
"{what}"
|
||||
msgstr ""
|
||||
"Verbinde mit\n"
|
||||
"{what}"
|
||||
|
||||
#: voice.py:123
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:128
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Just decided that\n"
|
||||
"{mac}\n"
|
||||
"needs no WiFi!"
|
||||
msgstr ""
|
||||
"Ich denke,\n"
|
||||
"dass {mac}\n"
|
||||
"kein WiFi brauch!"
|
||||
|
||||
#: voice.py:129
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Deauthenticating\n"
|
||||
"{mac}"
|
||||
msgstr ""
|
||||
"Deauthentifiziere\n"
|
||||
"{mac}"
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Kickbanning\n"
|
||||
"{mac}!"
|
||||
msgstr ""
|
||||
"Kicke\n"
|
||||
"{mac}!"
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Cool, we got {num}\n"
|
||||
"new handshake{plural}!"
|
||||
msgstr ""
|
||||
"Cool, wir haben {num}\n"
|
||||
"neue Handshake{plural}!"
|
||||
|
||||
#: voice.py:139
|
||||
msgid ""
|
||||
"Ops, something\n"
|
||||
"went wrong ...\n"
|
||||
"Rebooting ..."
|
||||
msgstr ""
|
||||
"Ops, da ist etwas\n"
|
||||
"schief gelaufen ...\n"
|
||||
"Starte neu ..."
|
||||
|
||||
#: voice.py:143
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "{num} Stationen gekicked\n"
|
||||
|
||||
#: voice.py:144
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "{num} Freunde gefunden\n"
|
||||
|
||||
#: voice.py:145
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "{num} Handshakes aufgez.\n"
|
||||
|
||||
#: voice.py:147
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr "1 Peer getroffen."
|
||||
|
||||
#: voice.py:149
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "{num} Peers getroffen"
|
||||
|
||||
#: voice.py:154
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem habe ich "
|
||||
"{associated} neue Freunde getroffen und {handshakes} Handshakes gefressen! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
"Ich war {duration} am Pwnen und habe {deauthed} Clients gekickt! Außerdem "
|
||||
"habe ich {associated} neue Freunde getroffen und {handshakes} Handshakes "
|
||||
"gefressen! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
|
Binary file not shown.
@ -0,0 +1,247 @@
|
||||
# pwnigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR Periklis Fregkos <fregkos@gmail.com>, 2019.
|
||||
# CO AUTHOR Panos Vasilopoulos <hello@alwayslivid.com>, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-10-03 12:22+0200\n"
|
||||
"PO-Revision-Date: 2019-10-03 08:00+0000\n"
|
||||
"Last-Translator: Periklis Fregkos <fregkos@gmail.com>\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:22
|
||||
#, fuzzy
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr "Γειά, είμαι το Pwnagotchi!Εκκινούμαι ..."
|
||||
|
||||
#: voice.py:23
|
||||
#, fuzzy
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr "Νέα μέρα, νέο κυνήγι,νέα pwns!"
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Hackαρε τον πλανήτη!"
|
||||
|
||||
#: voice.py:28
|
||||
msgid "AI ready."
|
||||
msgstr "ΤΝ έτοιμη."
|
||||
|
||||
#: voice.py:29
|
||||
#, fuzzy
|
||||
msgid "The neural network is ready."
|
||||
msgstr "Το νευρωνικό δίκτυοείναι έτοιμο."
|
||||
|
||||
#: voice.py:37
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr "Ε, το κανάλι {channel} είναιελεύθερο! Το AP σου θαείναι ευγνώμων."
|
||||
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Βαριέμαι ..."
|
||||
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Ας πάμε μια βόλτα!"
|
||||
|
||||
#: voice.py:45
|
||||
#, fuzzy
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr "Είναι η καλύτερημέρα της ζωής μου!"
|
||||
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Σκατένια μέρα :/"
|
||||
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr "Βαριέμαι πάρα πολύ ..."
|
||||
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Είμαι πολύ λυπημένο ..."
|
||||
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr "Είμαι λυπημένο"
|
||||
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Ζω την ζωή μου!"
|
||||
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Pwnάρω, άρα υπάρχω."
|
||||
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr "Τόσα πολλά δίκτυα!!!"
|
||||
|
||||
#: voice.py:62
|
||||
#, fuzzy
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr "Περνάω τέλεια!"
|
||||
|
||||
#: voice.py:63
|
||||
#, fuzzy
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr "Η περιέργεια είναιτο μόνο έγκλημά μου ..."
|
||||
|
||||
#: voice.py:67
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr "Γειά {name}!Χάρηκα για τη γνωριμία. {name}"
|
||||
|
||||
#: voice.py:68
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr "Η μονάδα{name}είναι κοντά! {name}"
|
||||
|
||||
#: voice.py:72
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr "Εμμ ...αντίο{name}"
|
||||
|
||||
#: voice.py:73
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "{name} is gone ..."
|
||||
msgstr "Το {name}έφυγε ..."
|
||||
|
||||
#: voice.py:77
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr "Ουπς ... Εξαφανίστηκε το{name}."
|
||||
|
||||
#: voice.py:78
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "{name} missed!"
|
||||
msgstr "Έχασα το{name}!"
|
||||
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr "Το έχασα!"
|
||||
|
||||
#: voice.py:83
|
||||
#, fuzzy
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr "Κανείς δε θέλει ναπαίξει μαζί μου ..."
|
||||
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr "Νιώθω μοναχός μου ..."
|
||||
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Μα, πού πήγαν όλοι;!"
|
||||
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Ξεκουράζομαι για {secs}s ..."
|
||||
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "Περιμένω για {secs}s ..."
|
||||
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Ψάχνω τριγύρω ({secs})"
|
||||
|
||||
#: voice.py:106
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr "Εε!{what},ας γίνουμε φίλοι!"
|
||||
|
||||
#: voice.py:107
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr "Συνδέομαι με το{what}"
|
||||
|
||||
#: voice.py:108
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr "Που'σαι ρε τρελέ{what}!"
|
||||
|
||||
#: voice.py:112
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr "Μόλις αποφάσισα ότι η{mac}δε χρείαζεται WiFi!"
|
||||
|
||||
#: voice.py:113
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr "Πετάω έξω την{mac}"
|
||||
|
||||
#: voice.py:114
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr "Μπανάρω την{mac}!"
|
||||
|
||||
#: voice.py:118
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr "Τέλεια δικέ μου, πήραμε {num}νέες χειραψίες!"
|
||||
|
||||
#: voice.py:121
|
||||
#, fuzzy
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr "Ουπς, κάτιπήγε λάθος ...Επανεκκινούμαι ..."
|
||||
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "Έριξα {num} σταθμούς\n"
|
||||
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "Έκανα {num} νέους φίλους\n"
|
||||
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "Πήρα {num} χειραψίες\n"
|
||||
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr "Γνώρισα 1 φίλο"
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "Γνώρισα {num} φίλους"
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Pwnαρα για {duration} και έριξα {deauthed} πελάτες! Επίσης γνώρισα "
|
||||
"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! "
|
||||
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
|
Binary file not shown.
@ -0,0 +1,237 @@
|
||||
# pwnigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR <7271496+quantumsheep@users.noreply.github.com>, 2019.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-10-03 12:22+0200\n"
|
||||
"PO-Revision-Date: 2019-10-03 10:34+0200\n"
|
||||
"Last-Translator: quantumsheep <7271496+quantumsheep@users.noreply.github."
|
||||
"com>\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: french\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:22
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:23
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:28
|
||||
msgid "AI ready."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:29
|
||||
msgid "The neural network is ready."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:37
|
||||
#, python-brace-format
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:45
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:62
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:63
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:67
|
||||
#, python-brace-format
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:68
|
||||
#, python-brace-format
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:72
|
||||
#, python-brace-format
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:73
|
||||
#, python-brace-format
|
||||
msgid "{name} is gone ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:77
|
||||
#, python-brace-format
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:78
|
||||
#, python-brace-format
|
||||
msgid "{name} missed!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:83
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:106
|
||||
#, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:107
|
||||
#, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:108
|
||||
#, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:113
|
||||
#, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:118
|
||||
#, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:121
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
Binary file not shown.
@ -1,339 +0,0 @@
|
||||
# pwnigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR Perilis Fregkos <fregkos@gmail.com>, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-29 13:42+0200\n"
|
||||
"PO-Revision-Date: 2019-10-01 16:22+0000\n"
|
||||
"Last-Translator: Panos Vasilopoulos <hello@alwayslivid.com>\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:16
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:21
|
||||
msgid ""
|
||||
"Hi, I'm Pwnagotchi!\n"
|
||||
"Starting ..."
|
||||
msgstr ""
|
||||
"Γεία, είμαι το Pwnagotchi!\n"
|
||||
"Εκκινούμαι ..."
|
||||
|
||||
#: voice.py:22
|
||||
msgid ""
|
||||
"New day, new hunt,\n"
|
||||
"new pwns!"
|
||||
msgstr ""
|
||||
"Νέα μέρα, νέο κυνήγι,\n"
|
||||
"νέα pwns!"
|
||||
|
||||
#: voice.py:23
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Hackαρε τον πλανήτη!"
|
||||
|
||||
#: voice.py:28
|
||||
msgid "AI ready."
|
||||
msgstr "ΤΝ έτοιμη."
|
||||
|
||||
#: voice.py:29
|
||||
msgid ""
|
||||
"The neural network\n"
|
||||
"is ready."
|
||||
msgstr ""
|
||||
"Το νευρωνικό δίκτυο\n"
|
||||
"είναι έτοιμο."
|
||||
|
||||
#: voice.py:39
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey, channel {channel} is\n"
|
||||
"free! Your AP will\n"
|
||||
"say thanks."
|
||||
msgstr ""
|
||||
"Ε, το κανάλι {channel} είναι\n"
|
||||
"ελεύθερο! Το AP σου θα\n"
|
||||
"είναι ευγνώμων."
|
||||
|
||||
#: voice.py:44
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Βαριέμαι ..."
|
||||
|
||||
#: voice.py:45
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Ας πάμε μια βόλτα!"
|
||||
|
||||
#: voice.py:49
|
||||
msgid ""
|
||||
"This is the best\n"
|
||||
"day of my life!"
|
||||
msgstr ""
|
||||
"Είναι η καλύτερη\n"
|
||||
"μέρα της ζωής μου!"
|
||||
|
||||
#: voice.py:53
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Σκατένια μέρα :/"
|
||||
|
||||
#: voice.py:58
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr "Βαριέμαι πάρα πολύ ..."
|
||||
|
||||
#: voice.py:59
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Είμαι πολύ λυπημένο ..."
|
||||
|
||||
#: voice.py:60
|
||||
msgid "I'm sad"
|
||||
msgstr "Είμαι λυπημένο"
|
||||
|
||||
#: voice.py:66
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Ζω την ζωή μου!"
|
||||
|
||||
#: voice.py:67
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Pwnάρω, άρα υπάρχω."
|
||||
|
||||
#: voice.py:68
|
||||
msgid "So many networks!!!"
|
||||
msgstr "Τόσα πολλά δίκτυα!!!"
|
||||
|
||||
#: voice.py:69
|
||||
msgid ""
|
||||
"I'm having so much\n"
|
||||
"fun!"
|
||||
msgstr "Περνάω τέλεια!"
|
||||
|
||||
#: voice.py:70
|
||||
msgid ""
|
||||
"My crime is that of\n"
|
||||
"curiosity ..."
|
||||
msgstr ""
|
||||
"Η περιέργεια είναι\n"
|
||||
"το μόνο έγκλημά μου ..."
|
||||
|
||||
#: voice.py:75
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello\n"
|
||||
"{name}!\n"
|
||||
"Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
"Γειά {name}!\n"
|
||||
"Χάρηκα για τη γνωριμία. {name}"
|
||||
|
||||
#: voice.py:76
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is nearby! {name}"
|
||||
msgstr ""
|
||||
"Η μονάδα\n"
|
||||
"{name}\n"
|
||||
"είναι κοντά! {name}"
|
||||
|
||||
#: voice.py:81
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Uhm ...\n"
|
||||
"goodbye\n"
|
||||
"{name}"
|
||||
msgstr ""
|
||||
"Εμμ ...\n"
|
||||
"αντίο\n"
|
||||
"{name}"
|
||||
|
||||
#: voice.py:82
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"is gone ..."
|
||||
msgstr ""
|
||||
"Το {name}\n"
|
||||
"έφυγε ..."
|
||||
|
||||
#: voice.py:87
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"is gone."
|
||||
msgstr ""
|
||||
"Ουπς ... \n"
|
||||
"Εξαφανίστηκε το\n"
|
||||
"{name}."
|
||||
|
||||
#: voice.py:88
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"missed!"
|
||||
msgstr ""
|
||||
"Έχασα το\n"
|
||||
"{name}!"
|
||||
|
||||
#: voice.py:89
|
||||
msgid "Missed!"
|
||||
msgstr "Το έχασα!"
|
||||
|
||||
#: voice.py:94
|
||||
msgid ""
|
||||
"Nobody wants to\n"
|
||||
"play with me ..."
|
||||
msgstr ""
|
||||
"Κανείς δε θέλει να\n"
|
||||
"παίξει μαζί μου ..."
|
||||
|
||||
#: voice.py:95
|
||||
msgid "I feel so alone ..."
|
||||
msgstr "Νιώθω μοναχός μου ..."
|
||||
|
||||
#: voice.py:96
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Μα, πού πήγαν όλοi;!"
|
||||
|
||||
#: voice.py:101
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Ξεκουράζομαι για {secs}s ..."
|
||||
|
||||
#: voice.py:102
|
||||
msgid "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:103
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "Περιμένω για {secs}s ..."
|
||||
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Ψάχνω τριγύρω ({secs})"
|
||||
|
||||
#: voice.py:121
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"let's be friends!"
|
||||
msgstr ""
|
||||
"Εε!\n"
|
||||
"{what},\n"
|
||||
"ας γίνουμε φίλοι!"
|
||||
|
||||
#: voice.py:122
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Associating to\n"
|
||||
"{what}"
|
||||
msgstr ""
|
||||
"Συνδέομαι με το\n"
|
||||
"{what}"
|
||||
|
||||
#: voice.py:123
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgstr ""
|
||||
"Που'σ ρε τρελέ\n"
|
||||
"{what}!"
|
||||
|
||||
#: voice.py:128
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Just decided that\n"
|
||||
"{mac}\n"
|
||||
"needs no WiFi!"
|
||||
msgstr ""
|
||||
"Μόλις αποφάσισα ότι η\n"
|
||||
"{mac}\n"
|
||||
"δε χρείαζεται WiFi!"
|
||||
|
||||
#: voice.py:129
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Deauthenticating\n"
|
||||
"{mac}"
|
||||
msgstr ""
|
||||
"Πετάω έξω την\n"
|
||||
"{mac}"
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Kickbanning\n"
|
||||
"{mac}!"
|
||||
msgstr ""
|
||||
"Μπανάρω την\n"
|
||||
"{mac}!"
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Cool, we got {num}\n"
|
||||
"new handshake{plural}!"
|
||||
msgstr ""
|
||||
"Τέλεια δικέ μου, πήραμε {num}\n"
|
||||
"νέες χειραψίες{plural}!"
|
||||
|
||||
#: voice.py:139
|
||||
msgid ""
|
||||
"Ops, something\n"
|
||||
"went wrong ...\n"
|
||||
"Rebooting ..."
|
||||
msgstr ""
|
||||
"Ουπς, κάτι\n"
|
||||
"πήγε λάθος ...\n"
|
||||
"Επανεκκινούμαι ..."
|
||||
|
||||
#: voice.py:143
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "Έριξα {num} σταθμούς\n"
|
||||
|
||||
#: voice.py:144
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "Έκανα {num} νέους φίλους\n"
|
||||
|
||||
#: voice.py:145
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "Πήρα {num} χειραψίες\n"
|
||||
|
||||
#: voice.py:147
|
||||
msgid "Met 1 peer"
|
||||
msgstr "Γνώρισα 1 φίλο"
|
||||
|
||||
#: voice.py:149
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "Γνώρισα {num} φίλους"
|
||||
|
||||
#: voice.py:154
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog "
|
||||
"#pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Pwnαρα για {duration} και έριξα {deauthed} πελάτες! Επίσης γνώρισα "
|
||||
"{associated} νέους φίλους και καταβρόχθισα {handshakes} χειραψίες! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
Binary file not shown.
@ -1,347 +1,239 @@
|
||||
# pwnigotchi voice data
|
||||
# pwnaigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019.
|
||||
# FIRST AUTHOR 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>, 2019.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-10-01 14:15+0200\n"
|
||||
"PO-Revision-Date: 2019-10-01 14:00+0200\n"
|
||||
"Last-Translator: 5h4d0wb0y <28193209+5h4d0wb0y@users.noreply.github.com>\n"
|
||||
"POT-Creation-Date: 2019-10-03 13:10+0200\n"
|
||||
"PO-Revision-Date: 2019-10-02 17:20+0000\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: italian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:18
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr "ZzzzZZzzzzZzzz"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:23
|
||||
msgid ""
|
||||
"Hi, I'm Pwnagotchi!\n"
|
||||
"Starting ..."
|
||||
msgstr ""
|
||||
"Ciao, sono Pwnagotchi!\n"
|
||||
"Avviamento ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:24
|
||||
msgid ""
|
||||
"New day, new hunt,\n"
|
||||
"new pwns!"
|
||||
msgstr ""
|
||||
"Nuovo giorno, nuova caccia,\n"
|
||||
"nuovi pwns!"
|
||||
#: voice.py:22
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr "Ciao! Piacere Pwnagotchi! Caricamento ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:25
|
||||
#: voice.py:23
|
||||
#, fuzzy
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr "Nuovo giorno...nuovi handshakes!!!"
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Hack il pianeta!"
|
||||
msgstr ""
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:30
|
||||
#: voice.py:28
|
||||
msgid "AI ready."
|
||||
msgstr "IA pronta."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:31
|
||||
msgid ""
|
||||
"The neural network\n"
|
||||
"is ready."
|
||||
msgstr ""
|
||||
"La rete neurale\n"
|
||||
"è pronta."
|
||||
#: voice.py:29
|
||||
msgid "The neural network is ready."
|
||||
msgstr "La rete neurale è pronta."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:41
|
||||
#: voice.py:37
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey, channel {channel} is\n"
|
||||
"free! Your AP will\n"
|
||||
"say thanks."
|
||||
msgstr ""
|
||||
"Hey, il canale {channel} è\n"
|
||||
"libero! Il tuo AP\n"
|
||||
"dirà grazie."
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr "Hey, il canale {channel} è libero! Il tuo AP ringrazia."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:46
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Sono annoiato ..."
|
||||
msgstr "Che noia ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:47
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Andiamo a fare una \npasseggiata!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:51
|
||||
msgid ""
|
||||
"This is the best\n"
|
||||
"day of my life!"
|
||||
msgstr ""
|
||||
"Questo è il migliore\n"
|
||||
"giorno della mia vita!"
|
||||
"Andiamo a fare una passeggiata!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:55
|
||||
#: voice.py:45
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr "Questo è il più bel giorno della mia vita!!!!"
|
||||
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Giorno di merda :/"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:60
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr ""
|
||||
"Sono estremamente\n"
|
||||
"annoiato ..."
|
||||
msgstr "Sono estremamente annoiato ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:61
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Sono molto triste ..."
|
||||
msgstr "Sono molto triste..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:62
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr "Sono triste"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:68
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Sto vivendo la vita!"
|
||||
msgstr "Mi sento vivo!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:69
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Possiedo quindi sono."
|
||||
msgstr "Pwn ergo sum."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:70
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr "Così tante reti!!!"
|
||||
msgstr "Qui è pieno di reti!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:71
|
||||
msgid ""
|
||||
"I'm having so much\n"
|
||||
"fun!"
|
||||
#: voice.py:62
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr "Mi sto divertendo tantissimo!"
|
||||
|
||||
#: voice.py:63
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr ""
|
||||
"Mi sto divertendo\n"
|
||||
"tanto!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:72
|
||||
msgid ""
|
||||
"My crime is that of\n"
|
||||
"curiosity ..."
|
||||
msgstr ""
|
||||
"La mia colpa è di\n"
|
||||
"essere curioso ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:77
|
||||
#: voice.py:67
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello\n"
|
||||
"{name}!\n"
|
||||
"Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
"Ciao\n"
|
||||
"{name}!\n"
|
||||
"Piacere di conoscerti. {name}"
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr "Ciao {name}! E' un piacere. {name}"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:78
|
||||
#: voice.py:68
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is nearby! {name}"
|
||||
msgstr ""
|
||||
"L'Unità\n"
|
||||
"{name}\n"
|
||||
"è vicina! {name}"
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr "L'Unità {name} è vicina! {name}"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:83
|
||||
#: voice.py:72
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Uhm ...\n"
|
||||
"goodbye\n"
|
||||
"{name}"
|
||||
msgstr ""
|
||||
"Uhm ...\n"
|
||||
"addio\n"
|
||||
"{name}"
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr "Uhm ... addio {name}, mi mancherai..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:84
|
||||
#: voice.py:73
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"is gone ..."
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"è andato ..."
|
||||
msgid "{name} is gone ..."
|
||||
msgstr "{name} se n'è andato ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:89
|
||||
#: voice.py:77
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"is gone."
|
||||
msgstr ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"è andato."
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr "Whoops ...{name} se n'è andato."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:90
|
||||
#: voice.py:78
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"missed!"
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"perso!"
|
||||
msgid "{name} missed!"
|
||||
msgstr "{name} è scomparso..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:91
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr "Perso!"
|
||||
msgstr "Ehi! Dove sei andato!?"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:96
|
||||
msgid ""
|
||||
"Nobody wants to\n"
|
||||
"play with me ..."
|
||||
msgstr ""
|
||||
"Nessuno vuole\n"
|
||||
"giocare con me..."
|
||||
#: voice.py:83
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr "Nessuno vuole giocare con me..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:97
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr "Mi sento così solo ..."
|
||||
msgstr "Mi sento così solo..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:98
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Dove sono tutti?!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:103
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Pisolino per {secs}i ..."
|
||||
msgstr "Schiaccio un pisolino per {secs}s ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:104
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:105
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr "ZzzZzzz ({secs}i)"
|
||||
msgstr ""
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:114
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "In attesa di {secs}i ..."
|
||||
msgstr "Aspetto {secs}s ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:116
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Guardando intorno ({secs}s)"
|
||||
msgstr "Do uno sguardo qui intorno... ({secs}s)"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:123
|
||||
#: voice.py:106
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"let's be friends!"
|
||||
msgstr ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"diventiamo amici!"
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr "Hey {what}! Diventiamo amici!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:124
|
||||
#: voice.py:107
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Associating to\n"
|
||||
"{what}"
|
||||
msgstr ""
|
||||
"Associarci a\n"
|
||||
"{what}"
|
||||
msgid "Associating to {what}"
|
||||
msgstr "Collegamento con {what} in corso..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:125
|
||||
#: voice.py:108
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgstr ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgid "Yo {what}!"
|
||||
msgstr "Yo {what}!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:130
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Just decided that\n"
|
||||
"{mac}\n"
|
||||
"needs no WiFi!"
|
||||
msgstr ""
|
||||
"Ho appena deciso che\n"
|
||||
"{mac}\n"
|
||||
"non necessita di\n"
|
||||
"WiFi!"
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr "Ho appena deciso che {mac} non necessita di WiFi!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:131
|
||||
#: voice.py:113
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Deauthenticating\n"
|
||||
"{mac}"
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr ""
|
||||
"Dissociarci da\n"
|
||||
"{mac}"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:132
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Kickbanning\n"
|
||||
"{mac}!"
|
||||
msgstr ""
|
||||
"Sto prendendo\n"
|
||||
"a calci\n"
|
||||
"{mac}!"
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr "Sto prendendo a calci {mac}!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:137
|
||||
#: voice.py:118
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Cool, we got {num}\n"
|
||||
"new handshake{plural}!"
|
||||
msgstr ""
|
||||
"Bene, abbiamo {num}\n"
|
||||
"nuovi handshake{plural}!"
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr "Bene, abbiamo {num} handshake{plural} in più!"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:141
|
||||
msgid ""
|
||||
"Ops, something\n"
|
||||
"went wrong ...\n"
|
||||
"Rebooting ..."
|
||||
msgstr ""
|
||||
"Ops, qualcosa\n"
|
||||
"è andato storto ...\n"
|
||||
"Riavvio ..."
|
||||
#: voice.py:121
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr "Ops, qualcosa è andato storto ... Riavvio ..."
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:145
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "Calciate {num} stazioni\n"
|
||||
msgstr "{num} stazioni pestate\n"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:146
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "Fatti {num} nuovi amici\n"
|
||||
msgstr "{num} nuovi amici\n"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:147
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "Presi {num} handshakes\n"
|
||||
msgstr "{num} handshakes presi\n"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:149
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr "Incontrato 1 peer"
|
||||
msgstr "1 peer incontrato"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:151
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "Incontrati {num} peers"
|
||||
msgstr "{num} peers incontrati"
|
||||
|
||||
#: /home/sh4d0wb0y/Projects/GitHub/pwnagotchi/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/voice.py:156
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Ho lavorato per {duration} e preso a calci i clienti di {deauthed}! Ho anche "
|
||||
"incontrato{associate} nuovi amici e ho mangiato {handshakes} handshakes! "
|
||||
"#pwnagotchi#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
"Ho lavorato per {duration} e preso a calci {deauthed} clients! Ho anche "
|
||||
"incontrato {associate} nuovi amici e ho mangiato {handshakes} handshakes! "
|
||||
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
|
Binary file not shown.
@ -0,0 +1,247 @@
|
||||
# pwnigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
|
||||
# kovach <2214005+kovachwt@users.noreply.github.com>, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-10-03 12:44+0200\n"
|
||||
"PO-Revision-Date: 2019-09-30 23:53+0200\n"
|
||||
"Last-Translator: kovach <2214005+kovachwt@users.noreply.github.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: mk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr "ДреееММмммМммм"
|
||||
|
||||
#: voice.py:22
|
||||
#, fuzzy
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr "Здраво, јас сум Pwnagotchi!Почнувам ..."
|
||||
|
||||
#: voice.py:23
|
||||
#, fuzzy
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr "Нов ден, нов лов,ќе си газиме!"
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Хак д Планет!"
|
||||
|
||||
#: voice.py:28
|
||||
msgid "AI ready."
|
||||
msgstr "AI спремно."
|
||||
|
||||
#: voice.py:29
|
||||
#, fuzzy
|
||||
msgid "The neural network is ready."
|
||||
msgstr "Невронската мрежае спремна."
|
||||
|
||||
#: voice.py:37
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr "Еј, каналот {channel} еслободен! APто ќе тикаже фала."
|
||||
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Досаднооо ..."
|
||||
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Ајде да шетнеме!"
|
||||
|
||||
#: voice.py:45
|
||||
#, fuzzy
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr "Ова ми е најдобриот ден во животот!"
|
||||
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Срање ден :/"
|
||||
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr "Ултра досадно ..."
|
||||
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Многу тажно ..."
|
||||
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr "Тажно"
|
||||
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Ммхх животче!"
|
||||
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Си газам значи постојам."
|
||||
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr "Мммм колку мрежи!!!"
|
||||
|
||||
#: voice.py:62
|
||||
#, fuzzy
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr "Јухуу забавноо ее!"
|
||||
|
||||
#: voice.py:63
|
||||
#, fuzzy
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr "Виновен сум само заљубопитност ..."
|
||||
|
||||
#: voice.py:67
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr "Здраво{name}!Мило ми е. {name}"
|
||||
|
||||
#: voice.py:68
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr "Опаа{name}е во близина! {name}"
|
||||
|
||||
#: voice.py:72
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr "Хмм ...чао{name}"
|
||||
|
||||
#: voice.py:73
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "{name} is gone ..."
|
||||
msgstr "{name}го снема ..."
|
||||
|
||||
#: voice.py:77
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr "Уупс ...{name}го снема."
|
||||
|
||||
#: voice.py:78
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "{name} missed!"
|
||||
msgstr "{name}промаши!"
|
||||
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr "Промаши!"
|
||||
|
||||
#: voice.py:83
|
||||
#, fuzzy
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr "Никој не сака даси игра со мене ..."
|
||||
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr "Толку сам ..."
|
||||
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Каде се сите?!"
|
||||
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Ќе дремнам {secs}с ..."
|
||||
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr "Дреммм"
|
||||
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr "Дремммм ({secs}с)"
|
||||
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "Чекам {secs}с ..."
|
||||
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Шарам наоколу ({secs}с)"
|
||||
|
||||
#: voice.py:106
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr "Еј{what}ајде да се дружиме!"
|
||||
|
||||
#: voice.py:107
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr "Се закачувам на{what}"
|
||||
|
||||
#: voice.py:108
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr "Јо{what}!"
|
||||
|
||||
#: voice.py:112
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr "Знаеш што, на{mac}не му треба WiFi!"
|
||||
|
||||
#: voice.py:113
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr "Го деавтентицирам{mac}"
|
||||
|
||||
#: voice.py:114
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr "Кикбан{mac}!"
|
||||
|
||||
#: voice.py:118
|
||||
#, fuzzy, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr "Кул, фативме {num}нови ракувања!"
|
||||
|
||||
#: voice.py:121
|
||||
#, fuzzy
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr "Упс, нешто не еко што треба ...Рестартирам ..."
|
||||
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "Избацив {num} станици\n"
|
||||
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "{num} нови другарчиња\n"
|
||||
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "Фатив {num} ракувања\n"
|
||||
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr "Запознав 1 пријател"
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "Запознав {num} пријатели"
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Си газам веќе {duration} и избацив {deauthed} клиенти! Запознав {associated} "
|
||||
"нови другарчиња и лапнав {handshakes} ракувања! #pwnagotchi #pwnlog #pwnlife "
|
||||
"#hacktheplanet #skynet"
|
Binary file not shown.
@ -3,43 +3,32 @@
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR justin-p@users.noreply.github.com, 2019.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-29 13:42+0200\n"
|
||||
"POT-Creation-Date: 2019-10-03 12:44+0200\n"
|
||||
"PO-Revision-Date: 2019-09-29 14:00+0200\n"
|
||||
"Last-Translator: Justin-P <justin-p@users.noreply.github.com>\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: english\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:16
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr "ZzzzZZzzzzZzzz"
|
||||
|
||||
#: voice.py:21
|
||||
msgid ""
|
||||
"Hi, I'm Pwnagotchi!\n"
|
||||
"Starting ..."
|
||||
msgstr ""
|
||||
"Hoi, Ik ben\n"
|
||||
"Pwnagotchi!\n"
|
||||
"Opstarten ..."
|
||||
|
||||
#: voice.py:22
|
||||
msgid ""
|
||||
"New day, new hunt,\n"
|
||||
"new pwns!"
|
||||
msgstr ""
|
||||
"Nieuwe dag,\n"
|
||||
"nieuwe jacht,\n"
|
||||
"nieuwe pwns!"
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr "Hoi, Ik ben Pwnagotchi! Opstarten ..."
|
||||
|
||||
#: voice.py:23
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr "Nieuwe dag, nieuwe jacht, nieuwe pwns!"
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr "Hack de Wereld!"
|
||||
|
||||
@ -48,301 +37,203 @@ msgid "AI ready."
|
||||
msgstr "AI is klaar."
|
||||
|
||||
#: voice.py:29
|
||||
msgid ""
|
||||
"The neural network\n"
|
||||
"is ready."
|
||||
msgstr ""
|
||||
"Neuronen netwerk\n"
|
||||
"is klaar voor gebruik."
|
||||
msgid "The neural network is ready."
|
||||
msgstr "Neuronen netwerkis klaar voor gebruik."
|
||||
|
||||
#: voice.py:39
|
||||
#: voice.py:37
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey, channel {channel} is\n"
|
||||
"free! Your AP will\n"
|
||||
"say thanks."
|
||||
msgstr ""
|
||||
"Hey, kanaal {channel} is\n"
|
||||
"vrij! Je AP zal je\n"
|
||||
"bedanken."
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr "Hey, kanaal {channel} is vrij! Je AP zal je bedanken."
|
||||
|
||||
#: voice.py:44
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr "Ik verveel me ..."
|
||||
|
||||
#: voice.py:45
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr "Laten we een rondje lopen!"
|
||||
|
||||
#: voice.py:49
|
||||
msgid ""
|
||||
"This is the best\n"
|
||||
"day of my life!"
|
||||
msgstr ""
|
||||
"Dit is de beste\n"
|
||||
"dag van mijn leven!"
|
||||
#: voice.py:45
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr "Dit is de beste dag van mijn leven!"
|
||||
|
||||
#: voice.py:53
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr "Ruk dag :/"
|
||||
|
||||
#: voice.py:58
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr "Ik verveel me \n"
|
||||
"kapot ..."
|
||||
msgstr "Ik verveel me kapot ..."
|
||||
|
||||
#: voice.py:59
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr "Ik ben erg\n"
|
||||
"verdrietig ..."
|
||||
msgstr "Ik ben ergverdrietig ..."
|
||||
|
||||
#: voice.py:60
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr "Ik ben verdrietig"
|
||||
|
||||
#: voice.py:66
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr "Beter kan het leven\n"
|
||||
"niet worden!"
|
||||
msgstr "Beter kan het levenniet worden!"
|
||||
|
||||
#: voice.py:67
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr "Ik pwn daarom besta ik."
|
||||
|
||||
#: voice.py:68
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr "Zo veel netwerken!!!"
|
||||
|
||||
#: voice.py:69
|
||||
msgid ""
|
||||
"I'm having so much\n"
|
||||
"fun!"
|
||||
#: voice.py:62
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr "Dit is zo leuk!"
|
||||
|
||||
#: voice.py:70
|
||||
msgid ""
|
||||
"My crime is that of\n"
|
||||
"curiosity ..."
|
||||
msgstr ""
|
||||
"Mijn enige misdrijf\n"
|
||||
"is mijn \n"
|
||||
"nieuwsgierigheid ..."
|
||||
#: voice.py:63
|
||||
#, fuzzy
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr "Mijn enige misdrijfis mijn nieuwsgierigheid ..."
|
||||
|
||||
#: voice.py:75
|
||||
#: voice.py:67
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello\n"
|
||||
"{name}!\n"
|
||||
"Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
"Hallo\n"
|
||||
"{name}!\n"
|
||||
"Leuk je te ontmoeten. {name}"
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr "Hallo {name}! Leuk je te ontmoeten. {name}"
|
||||
|
||||
#: voice.py:76
|
||||
#: voice.py:68
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is nearby! {name}"
|
||||
msgstr ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is dichtbij! {name}"
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr "Unit {name} is dichtbij! {name}"
|
||||
|
||||
#: voice.py:81
|
||||
#: voice.py:72
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Uhm ...\n"
|
||||
"goodbye\n"
|
||||
"{name}"
|
||||
msgstr ""
|
||||
"Uhm ...\n"
|
||||
"tot ziens\n"
|
||||
"{name}"
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr "Uhm ...tot ziens {name}"
|
||||
|
||||
#: voice.py:82
|
||||
#: voice.py:73
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"is gone ..."
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"is weg"
|
||||
msgid "{name} is gone ..."
|
||||
msgstr "{name} is weg"
|
||||
|
||||
#: voice.py:87
|
||||
#: voice.py:77
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"is gone."
|
||||
msgstr ""
|
||||
"Whoopsie ...\n"
|
||||
"{name}\n"
|
||||
"is weg"
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr "Whoopsie ...{name} is weg"
|
||||
|
||||
#: voice.py:88
|
||||
#: voice.py:78
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"missed!"
|
||||
msgstr ""
|
||||
"{name}\n"
|
||||
"gemist!"
|
||||
msgid "{name} missed!"
|
||||
msgstr "{name} gemist!"
|
||||
|
||||
#: voice.py:89
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr "Gemist!"
|
||||
|
||||
#: voice.py:94
|
||||
msgid ""
|
||||
"Nobody wants to\n"
|
||||
"play with me ..."
|
||||
msgstr ""
|
||||
"Niemand wil met\n"
|
||||
"mij spelen ..."
|
||||
#: voice.py:83
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr "Niemand wil metmij spelen ..."
|
||||
|
||||
#: voice.py:95
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr "Zo alleen ..."
|
||||
|
||||
#: voice.py:96
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr "Waar is iedereen?!"
|
||||
|
||||
#: voice.py:101
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr "Dutje doen voor {secs}s ..."
|
||||
|
||||
#: voice.py:102
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr "Zzzzz"
|
||||
|
||||
#: voice.py:103
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr "Even {secs}s wachten ..."
|
||||
|
||||
#: voice.py:114
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr "Rond kijken ({secs}s)"
|
||||
|
||||
#: voice.py:106
|
||||
#, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr "Hey {what}, laten we vriendenworden!"
|
||||
|
||||
#: voice.py:107
|
||||
#, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr "Verbinden met {what}"
|
||||
|
||||
#: voice.py:108
|
||||
#, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr "Ik vind dat {mac} genoeg WiFiheeft gehad!"
|
||||
|
||||
#: voice.py:113
|
||||
#, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr "De-autoriseren {mac}"
|
||||
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr "Ik ga {mac} even kicken!"
|
||||
|
||||
#: voice.py:118
|
||||
#, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr "Gaaf, we hebben {num} nieuwe handshake{plural}!"
|
||||
|
||||
#: voice.py:121
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"let's be friends!"
|
||||
msgstr ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"Laten we vrienden\n"
|
||||
"worden!"
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr "Oops, iets ging fout ...Rebooting ..."
|
||||
|
||||
#: voice.py:122
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Associating to\n"
|
||||
"{what}"
|
||||
msgstr ""
|
||||
"Verbinden met\n"
|
||||
"{what}"
|
||||
|
||||
#: voice.py:123
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgstr ""
|
||||
|
||||
|
||||
#: voice.py:128
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Just decided that\n"
|
||||
"{mac}\n"
|
||||
"needs no WiFi!"
|
||||
msgstr "Ik vind dat\n"
|
||||
"{mac}\n"
|
||||
"genoeg WiFi\n"
|
||||
"heeft gehad!"
|
||||
|
||||
#: voice.py:129
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Deauthenticating\n"
|
||||
"{mac}"
|
||||
msgstr ""
|
||||
"De-autoriseren\n"
|
||||
"{mac}"
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Kickbanning\n"
|
||||
"{mac}!"
|
||||
msgstr ""
|
||||
"Ik ga\n"
|
||||
"{mac}\n"
|
||||
"even kicken!"
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Cool, we got {num}\n"
|
||||
"new handshake{plural}!"
|
||||
msgstr ""
|
||||
"Gaaf, we hebben {num}\n"
|
||||
"nieuwe handshake{plural}!"
|
||||
|
||||
#: voice.py:139
|
||||
msgid ""
|
||||
"Ops, something\n"
|
||||
"went wrong ...\n"
|
||||
"Rebooting ..."
|
||||
msgstr ""
|
||||
"Oops, iets"
|
||||
"ging fout ...\n"
|
||||
"Rebooting ..."
|
||||
|
||||
#: voice.py:143
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr "{num} stations gekicked\n"
|
||||
|
||||
#: voice.py:144
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr "{num} nieuwe vrienden\n"
|
||||
|
||||
#: voice.py:145
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr "{num} nieuwe handshakes\n"
|
||||
|
||||
#: voice.py:147
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr "1 peer ontmoet"
|
||||
|
||||
#: voice.py:149
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr "{num} peers ontmoet"
|
||||
|
||||
#: voice.py:154
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
"{associated} new friends and ate {handshakes} handshakes! #pwnagotchi "
|
||||
"#pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
msgstr ""
|
||||
"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb ook "
|
||||
"{associated} nieuwe vrienden gevonden en heb {handshakes} handshakes gegeten! "
|
||||
"#pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
"Ik heb gepwned voor {duration} and heb {deauthed} clients gekicked! Ik heb "
|
||||
"ook {associated} nieuwe vrienden gevonden en heb {handshakes} handshakes "
|
||||
"gegeten! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet"
|
||||
|
@ -1,39 +1,35 @@
|
||||
# pwnigotchi voice data
|
||||
# Copyright (C) 2019
|
||||
# This file is distributed under the same license as the pwnagotchi package.
|
||||
# FIRST AUTHOR <33197631+dadav@users.noreply.github.com>, 2019.
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 0.0.1\n"
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-29 13:42+0200\n"
|
||||
"PO-Revision-Date: 2019-09-29 14:00+0200\n"
|
||||
"Last-Translator: dadav <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language-Team: pwnagotchi <33197631+dadav@users.noreply.github.com>\n"
|
||||
"Language: english\n"
|
||||
"POT-Creation-Date: 2019-10-03 13:10+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: voice.py:16
|
||||
#: voice.py:18
|
||||
msgid "ZzzzZZzzzzZzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:21
|
||||
msgid ""
|
||||
"Hi, I'm Pwnagotchi!\n"
|
||||
"Starting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:22
|
||||
msgid ""
|
||||
"New day, new hunt,\n"
|
||||
"new pwns!"
|
||||
msgid "Hi, I'm Pwnagotchi! Starting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:23
|
||||
msgid "New day, new hunt, new pwns!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:24
|
||||
msgid "Hack the Planet!"
|
||||
msgstr ""
|
||||
|
||||
@ -42,244 +38,196 @@ msgid "AI ready."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:29
|
||||
msgid ""
|
||||
"The neural network\n"
|
||||
"is ready."
|
||||
msgid "The neural network is ready."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:39
|
||||
#: voice.py:37
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey, channel {channel} is\n"
|
||||
"free! Your AP will\n"
|
||||
"say thanks."
|
||||
msgid "Hey, channel {channel} is free! Your AP will say thanks."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:44
|
||||
#: voice.py:41
|
||||
msgid "I'm bored ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:45
|
||||
#: voice.py:42
|
||||
msgid "Let's go for a walk!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:49
|
||||
msgid ""
|
||||
"This is the best\n"
|
||||
"day of my life!"
|
||||
#: voice.py:45
|
||||
msgid "This is the best day of my life!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:53
|
||||
#: voice.py:48
|
||||
msgid "Shitty day :/"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:58
|
||||
#: voice.py:52
|
||||
msgid "I'm extremely bored ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:59
|
||||
#: voice.py:53
|
||||
msgid "I'm very sad ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:60
|
||||
#: voice.py:54
|
||||
msgid "I'm sad"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:66
|
||||
#: voice.py:59
|
||||
msgid "I'm living the life!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:67
|
||||
#: voice.py:60
|
||||
msgid "I pwn therefore I am."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:68
|
||||
#: voice.py:61
|
||||
msgid "So many networks!!!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:69
|
||||
msgid ""
|
||||
"I'm having so much\n"
|
||||
"fun!"
|
||||
#: voice.py:62
|
||||
msgid "I'm having so much fun!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:70
|
||||
msgid ""
|
||||
"My crime is that of\n"
|
||||
"curiosity ..."
|
||||
#: voice.py:63
|
||||
msgid "My crime is that of curiosity ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:75
|
||||
#: voice.py:67
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hello\n"
|
||||
"{name}!\n"
|
||||
"Nice to meet you. {name}"
|
||||
msgid "Hello {name}! Nice to meet you. {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:76
|
||||
#: voice.py:68
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Unit\n"
|
||||
"{name}\n"
|
||||
"is nearby! {name}"
|
||||
msgid "Unit {name} is nearby! {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:81
|
||||
#: voice.py:72
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Uhm ...\n"
|
||||
"goodbye\n"
|
||||
"{name}"
|
||||
msgid "Uhm ... goodbye {name}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:82
|
||||
#: voice.py:73
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"is gone ..."
|
||||
msgid "{name} is gone ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:87
|
||||
#: voice.py:77
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Whoops ...\n"
|
||||
"{name}\n"
|
||||
"is gone."
|
||||
msgid "Whoops ... {name} is gone."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:88
|
||||
#: voice.py:78
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"{name}\n"
|
||||
"missed!"
|
||||
msgid "{name} missed!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:89
|
||||
#: voice.py:79
|
||||
msgid "Missed!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:94
|
||||
msgid ""
|
||||
"Nobody wants to\n"
|
||||
"play with me ..."
|
||||
#: voice.py:83
|
||||
msgid "Nobody wants to play with me ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:95
|
||||
#: voice.py:84
|
||||
msgid "I feel so alone ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:96
|
||||
#: voice.py:85
|
||||
msgid "Where's everybody?!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:101
|
||||
#: voice.py:89
|
||||
#, python-brace-format
|
||||
msgid "Napping for {secs}s ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:102
|
||||
#: voice.py:90
|
||||
msgid "Zzzzz"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:103
|
||||
#: voice.py:91
|
||||
#, python-brace-format
|
||||
msgid "ZzzZzzz ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#: voice.py:98
|
||||
#, python-brace-format
|
||||
msgid "Waiting for {secs}s ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:114
|
||||
#: voice.py:100
|
||||
#, python-brace-format
|
||||
msgid "Looking around ({secs}s)"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:106
|
||||
#, python-brace-format
|
||||
msgid "Hey {what} let's be friends!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:107
|
||||
#, python-brace-format
|
||||
msgid "Associating to {what}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:108
|
||||
#, python-brace-format
|
||||
msgid "Yo {what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:112
|
||||
#, python-brace-format
|
||||
msgid "Just decided that {mac} needs no WiFi!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:113
|
||||
#, python-brace-format
|
||||
msgid "Deauthenticating {mac}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:114
|
||||
#, python-brace-format
|
||||
msgid "Kickbanning {mac}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:118
|
||||
#, python-brace-format
|
||||
msgid "Cool, we got {num} new handshake{plural}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:121
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hey\n"
|
||||
"{what}\n"
|
||||
"let's be friends!"
|
||||
msgid "Ops, something went wrong ... Rebooting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:122
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Associating to\n"
|
||||
"{what}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:123
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Yo\n"
|
||||
"{what}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:128
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Just decided that\n"
|
||||
"{mac}\n"
|
||||
"needs no WiFi!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:129
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Deauthenticating\n"
|
||||
"{mac}"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Kickbanning\n"
|
||||
"{mac}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Cool, we got {num}\n"
|
||||
"new handshake{plural}!"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:139
|
||||
msgid ""
|
||||
"Ops, something\n"
|
||||
"went wrong ...\n"
|
||||
"Rebooting ..."
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:143
|
||||
#: voice.py:124
|
||||
#, python-brace-format
|
||||
msgid "Kicked {num} stations\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:144
|
||||
#: voice.py:125
|
||||
#, python-brace-format
|
||||
msgid "Made {num} new friends\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:145
|
||||
#: voice.py:126
|
||||
#, python-brace-format
|
||||
msgid "Got {num} handshakes\n"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:147
|
||||
#: voice.py:128
|
||||
msgid "Met 1 peer"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:149
|
||||
#: voice.py:130
|
||||
#, python-brace-format
|
||||
msgid "Met {num} peers"
|
||||
msgstr ""
|
||||
|
||||
#: voice.py:154
|
||||
#: voice.py:135
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"I've been pwning for {duration} and kicked {deauthed} clients! I've also met "
|
||||
|
@ -160,6 +160,9 @@ class SessionParser(object):
|
||||
break
|
||||
lines.reverse()
|
||||
|
||||
if len(lines) == 0:
|
||||
lines.append("Initial Session");
|
||||
|
||||
self.last_session = lines
|
||||
self.last_session_id = hashlib.md5(lines[0].encode()).hexdigest()
|
||||
self.last_saved_session_id = self._get_last_saved_session_id()
|
||||
|
@ -1,7 +1,7 @@
|
||||
import _thread
|
||||
|
||||
import core
|
||||
import pwnagotchi
|
||||
import pwnagotchi, pwnagotchi.plugins as plugins
|
||||
from pwnagotchi.mesh import get_identity
|
||||
|
||||
|
||||
@ -37,6 +37,8 @@ class AsyncAdvertiser(object):
|
||||
|
||||
def _on_new_unit(self, peer):
|
||||
self._view.on_new_peer(peer)
|
||||
plugins.on('peer_detected', self, peer)
|
||||
|
||||
def _on_lost_unit(self, peer):
|
||||
self._view.on_lost_peer(peer)
|
||||
plugins.on('peer_lost', self, peer)
|
||||
|
@ -0,0 +1,43 @@
|
||||
import os
|
||||
import glob
|
||||
import importlib, importlib.util
|
||||
|
||||
default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default")
|
||||
loaded = {}
|
||||
|
||||
|
||||
def dummy_callback():
|
||||
pass
|
||||
|
||||
|
||||
def on(event_name, *args, **kwargs):
|
||||
global loaded
|
||||
cb_name = 'on_%s' % event_name
|
||||
for _, plugin in loaded.items():
|
||||
if cb_name in plugin.__dict__:
|
||||
# print("calling %s %s(%s)" %(cb_name, args, kwargs))
|
||||
plugin.__dict__[cb_name](*args, **kwargs)
|
||||
|
||||
|
||||
def load_from_file(filename):
|
||||
plugin_name = os.path.basename(filename.replace(".py", ""))
|
||||
spec = importlib.util.spec_from_file_location(plugin_name, filename)
|
||||
instance = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(instance)
|
||||
return plugin_name, instance
|
||||
|
||||
|
||||
def load_from_path(path):
|
||||
global loaded
|
||||
|
||||
for filename in glob.glob(os.path.join(path, "*.py")):
|
||||
name, plugin = load_from_file(filename)
|
||||
if name in loaded:
|
||||
raise Exception("plugin %s already loaded from %s" % (name, plugin.__file__))
|
||||
elif not plugin.__enabled__:
|
||||
# print("plugin %s is not enabled" % name)
|
||||
pass
|
||||
else:
|
||||
loaded[name] = plugin
|
||||
|
||||
return loaded
|
@ -0,0 +1,162 @@
|
||||
__author__ = 'evilsocket@gmail.com'
|
||||
__version__ = '1.0.0'
|
||||
__name__ = 'hello_world'
|
||||
__license__ = 'GPL3'
|
||||
__description__ = 'An example plugin for pwnagotchi that implements all the available callbacks.'
|
||||
__enabled__ = False # IMPORTANT: set this to True to enable your plugin.
|
||||
|
||||
from pwnagotchi.ui.components import LabeledValue
|
||||
from pwnagotchi.ui.view import BLACK
|
||||
import pwnagotchi.ui.fonts as fonts
|
||||
import core
|
||||
|
||||
|
||||
# called when the plugin is loaded
|
||||
def on_loaded():
|
||||
core.log("WARNING: plugin %s should be disabled!" % __name__)
|
||||
|
||||
|
||||
# called to setup the ui elements
|
||||
def on_ui_setup(ui):
|
||||
# add custom UI elements
|
||||
ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),
|
||||
label_font=fonts.Bold, text_font=fonts.Medium))
|
||||
|
||||
|
||||
# called when the ui is updated
|
||||
def on_ui_update(ui):
|
||||
# update those elements
|
||||
some_voltage = 0.1
|
||||
some_capacity = 100.0
|
||||
|
||||
ui.set('ups', "%4.2fV/%2i%%" % (some_voltage, some_capacity))
|
||||
|
||||
|
||||
# called when the hardware display setup is done, display is an hardware specific object
|
||||
def on_display_setup(display):
|
||||
pass
|
||||
|
||||
|
||||
# called when everything is ready and the main loop is about to start
|
||||
def on_ready(agent):
|
||||
core.log("unit is ready")
|
||||
# you can run custom bettercap commands if you want
|
||||
# agent.run('ble.recon on')
|
||||
# or set a custom state
|
||||
# agent.set_bored()
|
||||
|
||||
|
||||
# called when the AI finished loading
|
||||
def on_ai_ready(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the AI finds a new set of parameters
|
||||
def on_ai_policy(agent, policy):
|
||||
pass
|
||||
|
||||
|
||||
# called when the AI starts training for a given number of epochs
|
||||
def on_ai_training_start(agent, epochs):
|
||||
pass
|
||||
|
||||
|
||||
# called after the AI completed a training epoch
|
||||
def on_ai_training_step(agent, _locals, _globals):
|
||||
pass
|
||||
|
||||
|
||||
# called when the AI has done training
|
||||
def on_ai_training_end(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the AI got the best reward so far
|
||||
def on_ai_best_reward(agent, reward):
|
||||
pass
|
||||
|
||||
|
||||
# called when the AI got the best reward so far
|
||||
def on_ai_worst_reward(agent, reward):
|
||||
pass
|
||||
|
||||
|
||||
# called when a non overlapping wifi channel is found to be free
|
||||
def on_free_channel(agent, channel):
|
||||
pass
|
||||
|
||||
|
||||
# called when the status is set to bored
|
||||
def on_bored(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the status is set to sad
|
||||
def on_sad(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the status is set to excited
|
||||
def on_excited(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the status is set to lonely
|
||||
def on_lonely(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the agent is rebooting the board
|
||||
def on_rebooting(agent):
|
||||
pass
|
||||
|
||||
|
||||
# called when the agent is waiting for t seconds
|
||||
def on_wait(agent, t):
|
||||
pass
|
||||
|
||||
|
||||
# called when the agent is sleeping for t seconds
|
||||
def on_sleep(agent, t):
|
||||
pass
|
||||
|
||||
|
||||
# called when the agent refreshed its access points list
|
||||
def on_wifi_update(agent, access_points):
|
||||
pass
|
||||
|
||||
|
||||
# called when the agent is sending an association frame
|
||||
def on_association(agent, access_point):
|
||||
pass
|
||||
|
||||
|
||||
# callend when the agent is deauthenticating a client station from an AP
|
||||
def on_deauthentication(agent, access_point, client_station):
|
||||
pass
|
||||
|
||||
|
||||
# callend when the agent is tuning on a specific channel
|
||||
def on_channel_hop(agent, channel):
|
||||
pass
|
||||
|
||||
|
||||
# called when a new handshake is captured, access_point and client_station are json objects
|
||||
# if the agent could match the BSSIDs to the current list, otherwise they are just the strings of the BSSIDs
|
||||
def on_handshake(agent, filename, access_point, client_station):
|
||||
pass
|
||||
|
||||
|
||||
# called when an epoch is over (where an epoch is a single loop of the main algorithm)
|
||||
def on_epoch(agent, epoch, epoch_data):
|
||||
pass
|
||||
|
||||
|
||||
# called when a new peer is detected
|
||||
def on_peer_detected(agent, peer):
|
||||
pass
|
||||
|
||||
|
||||
# called when a known peer is lost
|
||||
def on_peer_lost(agent, peer):
|
||||
pass
|
@ -0,0 +1,47 @@
|
||||
__author__ = 'evilsocket@gmail.com'
|
||||
__version__ = '1.0.0'
|
||||
__name__ = 'gps'
|
||||
__license__ = 'GPL3'
|
||||
__description__ = 'Save GPS coordinates whenever an handshake is captured.'
|
||||
__enabled__ = True # set to false if you just don't use GPS
|
||||
|
||||
import core
|
||||
import json
|
||||
import os
|
||||
|
||||
device = '/dev/ttyUSB0'
|
||||
speed = 19200
|
||||
running = False
|
||||
|
||||
|
||||
def on_loaded():
|
||||
core.log("GPS plugin loaded for %s" % device)
|
||||
|
||||
|
||||
def on_ready(agent):
|
||||
global running
|
||||
|
||||
if os.path.exists(device):
|
||||
core.log("enabling GPS bettercap's module for %s" % device)
|
||||
try:
|
||||
agent.run('gps off')
|
||||
except:
|
||||
pass
|
||||
|
||||
agent.run('set gps.device %s' % device)
|
||||
agent.run('set gps.speed %d' % speed)
|
||||
agent.run('gps on')
|
||||
running = True
|
||||
else:
|
||||
core.log("no GPS detected")
|
||||
|
||||
|
||||
def on_handshake(agent, filename, access_point, client_station):
|
||||
if running:
|
||||
info = agent.session()
|
||||
gps = info['gps']
|
||||
gps_filename = filename.replace('.pcap', '.gps.json')
|
||||
|
||||
core.log("saving GPS to %s (%s)" % (gps_filename, gps))
|
||||
with open(gps_filename, 'w+t') as fp:
|
||||
json.dump(gps, fp)
|
@ -0,0 +1,65 @@
|
||||
# Based on UPS Lite v1.1 from https://github.com/xenDE
|
||||
#
|
||||
# funtions for get UPS status - needs enable "i2c" in raspi-config
|
||||
#
|
||||
# https://github.com/linshuqin329/UPS-Lite
|
||||
#
|
||||
# For Raspberry Pi Zero Ups Power Expansion Board with Integrated Serial Port S3U4
|
||||
# https://www.ebay.de/itm/For-Raspberry-Pi-Zero-Ups-Power-Expansion-Board-with-Integrated-Serial-Port-S3U4/323873804310
|
||||
# https://www.aliexpress.com/item/32888533624.html
|
||||
__author__ = 'evilsocket@gmail.com'
|
||||
__version__ = '1.0.0'
|
||||
__name__ = 'ups_lite'
|
||||
__license__ = 'GPL3'
|
||||
__description__ = 'A plugin that will add a voltage indicator for the UPS Lite v1.1'
|
||||
__enabled__ = False
|
||||
|
||||
import struct
|
||||
|
||||
from pwnagotchi.ui.components import LabeledValue
|
||||
from pwnagotchi.ui.view import BLACK
|
||||
import pwnagotchi.ui.fonts as fonts
|
||||
|
||||
|
||||
# TODO: add enable switch in config.yml an cleanup all to the best place
|
||||
class UPS:
|
||||
def __init__(self):
|
||||
# only import when the module is loaded and enabled
|
||||
import smbus
|
||||
# 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
|
||||
self._bus = smbus.SMBus(1)
|
||||
|
||||
def voltage(self):
|
||||
try:
|
||||
address = 0x36
|
||||
read = self._bus.read_word_data(address, 2)
|
||||
swapped = struct.unpack("<H", struct.pack(">H", read))[0]
|
||||
return swapped * 1.25 / 1000 / 16
|
||||
except:
|
||||
return 0.0
|
||||
|
||||
def capacity(self):
|
||||
try:
|
||||
address = 0x36
|
||||
read = self._bus.read_word_data(address, 4)
|
||||
swapped = struct.unpack("<H", struct.pack(">H", read))[0]
|
||||
return swapped / 256
|
||||
except:
|
||||
return 0.0
|
||||
|
||||
|
||||
ups = None
|
||||
|
||||
|
||||
def on_loaded():
|
||||
global ups
|
||||
ups = UPS()
|
||||
|
||||
|
||||
def on_ui_setup(ui):
|
||||
ui.add_element('ups', LabeledValue(color=BLACK, label='UPS', value='0%/0V', position=(ui.width() / 2 - 25, 0),
|
||||
label_font=fonts.Bold, text_font=fonts.Medium))
|
||||
|
||||
|
||||
def on_ui_update(ui):
|
||||
ui.set('ups', "%4.2fV/%2i%%" % (ups.voltage(), ups.capacity()))
|
@ -1,4 +1,5 @@
|
||||
from PIL import Image
|
||||
from textwrap import TextWrapper
|
||||
|
||||
|
||||
class Widget(object):
|
||||
@ -39,14 +40,21 @@ class FilledRect(Widget):
|
||||
|
||||
|
||||
class Text(Widget):
|
||||
def __init__(self, value="", position=(0, 0), font=None, color=0):
|
||||
def __init__(self, value="", position=(0, 0), font=None, color=0, wrap=False, max_length=0):
|
||||
super().__init__(position, color)
|
||||
self.value = value
|
||||
self.font = font
|
||||
self.wrap = wrap
|
||||
self.max_length = max_length
|
||||
self.wrapper = TextWrapper(width=self.max_length, replace_whitespace=False) if wrap else None
|
||||
|
||||
def draw(self, canvas, drawer):
|
||||
if self.value is not None:
|
||||
drawer.text(self.xy, self.value, font=self.font, fill=self.color)
|
||||
if self.wrap:
|
||||
text = '\n'.join(self.wrapper.wrap(self.value))
|
||||
else:
|
||||
text = self.value
|
||||
drawer.text(self.xy, text, font=self.font, fill=self.color)
|
||||
|
||||
|
||||
class LabeledValue(Widget):
|
||||
|
@ -5,7 +5,7 @@ from PIL import Image
|
||||
import shutil
|
||||
import core
|
||||
import os
|
||||
import pwnagotchi
|
||||
import pwnagotchi, pwnagotchi.plugins as plugins
|
||||
|
||||
from pwnagotchi.ui.view import WHITE, View
|
||||
|
||||
@ -156,6 +156,8 @@ class Display(View):
|
||||
else:
|
||||
core.log("unknown display type %s" % self._display_type)
|
||||
|
||||
plugins.on('display_setup', self._display)
|
||||
|
||||
self.on_render(self._on_view_rendered)
|
||||
|
||||
def image(self):
|
||||
|
@ -15,3 +15,4 @@ LONELY = '(ب__ب)'
|
||||
SAD = '(╥☁╥ )'
|
||||
FRIEND = '(♥‿‿♥)'
|
||||
BROKEN = '(☓‿‿☓)'
|
||||
DEBUG = '(#__#)'
|
||||
|
@ -6,6 +6,11 @@ class State(object):
|
||||
self._state = state
|
||||
self._lock = Lock()
|
||||
self._listeners = {}
|
||||
self._changes = {}
|
||||
|
||||
def add_element(self, key, elem):
|
||||
self._state[key] = elem
|
||||
self._changes[key] = True
|
||||
|
||||
def add_listener(self, key, cb):
|
||||
with self._lock:
|
||||
@ -19,10 +24,29 @@ class State(object):
|
||||
with self._lock:
|
||||
return self._state[key].value if key in self._state else None
|
||||
|
||||
def reset(self):
|
||||
with self._lock:
|
||||
self._changes = {}
|
||||
|
||||
def changes(self, ignore=()):
|
||||
with self._lock:
|
||||
changes = []
|
||||
for change in self._changes.keys():
|
||||
if change not in ignore:
|
||||
changes.append(change)
|
||||
return changes
|
||||
|
||||
def has_changes(self):
|
||||
with self._lock:
|
||||
return len(self._changes) > 0
|
||||
|
||||
def set(self, key, value):
|
||||
with self._lock:
|
||||
if key in self._state:
|
||||
prev = self._state[key].value
|
||||
self._state[key].value = value
|
||||
if key in self._listeners and self._listeners[key] is not None and prev != value:
|
||||
self._listeners[key](prev, value)
|
||||
|
||||
if prev != value:
|
||||
self._changes[key] = True
|
||||
if key in self._listeners and self._listeners[key] is not None:
|
||||
self._listeners[key](prev, value)
|
||||
|
@ -4,7 +4,7 @@ import time
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
import core
|
||||
import pwnagotchi
|
||||
import pwnagotchi.plugins as plugins
|
||||
from pwnagotchi.voice import Voice
|
||||
|
||||
import pwnagotchi.ui.fonts as fonts
|
||||
@ -41,7 +41,7 @@ def setup_display_specifics(config):
|
||||
name_pos = (int(width / 2) - 15, int(height * .15))
|
||||
status_pos = (int(width / 2) - 15, int(height * .30))
|
||||
|
||||
elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1',
|
||||
elif config['ui']['display']['type'] in ('ws_1', 'ws1', 'waveshare_1', 'waveshare1',
|
||||
'ws_2', 'ws2', 'waveshare_2', 'waveshare2'):
|
||||
if config['ui']['display']['color'] == 'black':
|
||||
fonts.setup(10, 9, 10, 35)
|
||||
@ -87,22 +87,25 @@ class View(object):
|
||||
label_font=fonts.Bold,
|
||||
text_font=fonts.Medium),
|
||||
|
||||
# 'square': Rect([1, 11, 124, 111]),
|
||||
'line1': Line([0, int(self._height * .12), self._width, int(self._height * .12)], color=BLACK),
|
||||
'line2': Line(
|
||||
[0, self._height - int(self._height * .12), self._width, self._height - int(self._height * .12)],
|
||||
color=BLACK),
|
||||
|
||||
# 'histogram': Histogram([4, 94], color = BLACK),
|
||||
|
||||
'face': Text(value=faces.SLEEP, position=face_pos, color=BLACK, font=fonts.Huge),
|
||||
|
||||
'friend_face': Text(value=None, position=(0, 90), font=fonts.Bold, color=BLACK),
|
||||
'friend_name': Text(value=None, position=(40, 93), font=fonts.BoldSmall, color=BLACK),
|
||||
|
||||
'name': Text(value='%s>' % 'pwnagotchi', position=name_pos, color=BLACK, font=fonts.Bold),
|
||||
# 'face2': Bitmap( '/root/pwnagotchi/data/images/face_happy.bmp', (0, 20)),
|
||||
'status': Text(value=self._voice.default(), position=status_pos, color=BLACK, font=fonts.Medium),
|
||||
|
||||
'status': Text(value=self._voice.default(),
|
||||
position=status_pos,
|
||||
color=BLACK,
|
||||
font=fonts.Medium,
|
||||
wrap=True,
|
||||
# the current maximum number of characters per line, assuming each character is 6 pixels wide
|
||||
max_length=(self._width - status_pos[0]) // 6),
|
||||
|
||||
'shakes': LabeledValue(label='PWND ', value='0 (00)', color=BLACK,
|
||||
position=(0, self._height - int(self._height * .12) + 1), label_font=fonts.Bold,
|
||||
@ -114,7 +117,23 @@ class View(object):
|
||||
for key, value in state.items():
|
||||
self._state.set(key, value)
|
||||
|
||||
_thread.start_new_thread(self._refresh_handler, ())
|
||||
plugins.on('ui_setup', self)
|
||||
|
||||
if config['ui']['fps'] > 0.0:
|
||||
_thread.start_new_thread(self._refresh_handler, ())
|
||||
self._ignore_changes = ()
|
||||
else:
|
||||
core.log("ui.fps is 0, the display will only update for major changes")
|
||||
self._ignore_changes = ('uptime', 'name')
|
||||
|
||||
def add_element(self, key, elem):
|
||||
self._state.add_element(key, elem)
|
||||
|
||||
def width(self):
|
||||
return self._width
|
||||
|
||||
def height(self):
|
||||
return self._height
|
||||
|
||||
def on_state_change(self, key, cb):
|
||||
self._state.add_listener(key, cb)
|
||||
@ -227,12 +246,12 @@ class View(object):
|
||||
if sleeping:
|
||||
if secs > 1:
|
||||
self.set('face', faces.SLEEP)
|
||||
self.set('status', self._voice.on_napping(secs))
|
||||
self.set('status', self._voice.on_napping(int(secs)))
|
||||
else:
|
||||
self.set('face', faces.SLEEP2)
|
||||
self.set('status', self._voice.on_awakening())
|
||||
else:
|
||||
self.set('status', self._voice.on_waiting(secs))
|
||||
self.set('status', self._voice.on_waiting(int(secs)))
|
||||
if step % 2 == 0:
|
||||
self.set('face', faces.LOOK_R)
|
||||
else:
|
||||
@ -298,13 +317,24 @@ class View(object):
|
||||
self.set('status', self._voice.on_rebooting())
|
||||
self.update()
|
||||
|
||||
def on_custom(self, text):
|
||||
self.set('face', faces.DEBUG)
|
||||
self.set('status', self._voice.custom(text))
|
||||
self.update()
|
||||
|
||||
def update(self):
|
||||
with self._lock:
|
||||
self._canvas = Image.new('1', (self._width, self._height), WHITE)
|
||||
drawer = ImageDraw.Draw(self._canvas)
|
||||
changes = self._state.changes(ignore=self._ignore_changes)
|
||||
if len(changes):
|
||||
self._canvas = Image.new('1', (self._width, self._height), WHITE)
|
||||
drawer = ImageDraw.Draw(self._canvas)
|
||||
|
||||
for key, lv in self._state.items():
|
||||
lv.draw(self._canvas, drawer)
|
||||
plugins.on('ui_update', self)
|
||||
|
||||
for cb in self._render_cbs:
|
||||
cb(self._canvas)
|
||||
for key, lv in self._state.items():
|
||||
lv.draw(self._canvas, drawer)
|
||||
|
||||
for cb in self._render_cbs:
|
||||
cb(self._canvas)
|
||||
|
||||
self._state.reset()
|
||||
|
@ -1,218 +1,225 @@
|
||||
# //*****************************************************************************
|
||||
# * | File : epd2in13.py
|
||||
# * | Author : Waveshare team
|
||||
# * | Function : Electronic paper driver
|
||||
# * | Info :
|
||||
# *----------------
|
||||
# * | This version: V3.1
|
||||
# * | Date : 2019-03-20
|
||||
# * | Info : python3 demo
|
||||
# * fix: TurnOnDisplay()
|
||||
# ******************************************************************************//
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documnetation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and//or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
|
||||
|
||||
from . import epdconfig
|
||||
from PIL import Image
|
||||
import RPi.GPIO as GPIO
|
||||
# import numpy as np
|
||||
|
||||
# Display resolution
|
||||
EPD_WIDTH = 122
|
||||
EPD_HEIGHT = 250
|
||||
|
||||
class EPD:
|
||||
def __init__(self):
|
||||
self.reset_pin = epdconfig.RST_PIN
|
||||
self.dc_pin = epdconfig.DC_PIN
|
||||
self.busy_pin = epdconfig.BUSY_PIN
|
||||
self.width = EPD_WIDTH
|
||||
self.height = EPD_HEIGHT
|
||||
lut_full_update = [
|
||||
0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
]
|
||||
|
||||
lut_partial_update = [
|
||||
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
]
|
||||
|
||||
# Hardware reset
|
||||
def reset(self):
|
||||
epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
|
||||
epdconfig.delay_ms(200)
|
||||
epdconfig.digital_write(self.reset_pin, GPIO.LOW) # module reset
|
||||
epdconfig.delay_ms(200)
|
||||
epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
|
||||
epdconfig.delay_ms(200)
|
||||
|
||||
def send_command(self, command):
|
||||
epdconfig.digital_write(self.dc_pin, GPIO.LOW)
|
||||
epdconfig.spi_writebyte([command])
|
||||
|
||||
def send_data(self, data):
|
||||
epdconfig.digital_write(self.dc_pin, GPIO.HIGH)
|
||||
epdconfig.spi_writebyte([data])
|
||||
|
||||
def wait_until_idle(self):
|
||||
# print("busy")
|
||||
while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy
|
||||
epdconfig.delay_ms(100)
|
||||
# print("free busy")
|
||||
|
||||
def TurnOnDisplay(self):
|
||||
self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
|
||||
self.send_data(0xC4)
|
||||
self.send_command(0x20) # MASTER_ACTIVATION
|
||||
self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE
|
||||
self.wait_until_idle()
|
||||
|
||||
def init(self, lut):
|
||||
if (epdconfig.module_init() != 0):
|
||||
return -1
|
||||
# EPD hardware init start
|
||||
self.reset()
|
||||
self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
|
||||
self.send_data((EPD_HEIGHT - 1) & 0xFF)
|
||||
self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF)
|
||||
self.send_data(0x00) # GD = 0 SM = 0 TB = 0
|
||||
|
||||
self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL
|
||||
self.send_data(0xD7)
|
||||
self.send_data(0xD6)
|
||||
self.send_data(0x9D)
|
||||
|
||||
self.send_command(0x2C) # WRITE_VCOM_REGISTER
|
||||
self.send_data(0xA8) # VCOM 7C
|
||||
|
||||
self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD
|
||||
self.send_data(0x1A) # 4 dummy lines per gate
|
||||
|
||||
self.send_command(0x3B) # SET_GATE_TIME
|
||||
self.send_data(0x08) # 2us per line
|
||||
|
||||
self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL
|
||||
self.send_data(0x03)
|
||||
|
||||
self.send_command(0X11) # DATA_ENTRY_MODE_SETTING
|
||||
self.send_data(0x03) # X increment; Y increment
|
||||
|
||||
# WRITE_LUT_REGISTER
|
||||
self.send_command(0x32)
|
||||
for count in range(30):
|
||||
self.send_data(lut[count])
|
||||
|
||||
return 0
|
||||
|
||||
##
|
||||
# @brief: specify the memory area for data R//W
|
||||
##
|
||||
def SetWindows(self, x_start, y_start, x_end, y_end):
|
||||
self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
|
||||
self.send_data((x_start >> 3) & 0xFF)
|
||||
self.send_data((x_end >> 3) & 0xFF)
|
||||
self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
|
||||
self.send_data(y_start & 0xFF)
|
||||
self.send_data((y_start >> 8) & 0xFF)
|
||||
self.send_data(y_end & 0xFF)
|
||||
self.send_data((y_end >> 8) & 0xFF)
|
||||
|
||||
##
|
||||
# @brief: specify the start point for data R//W
|
||||
##
|
||||
def SetCursor(self, x, y):
|
||||
self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER
|
||||
# x point must be the multiple of 8 or the last 3 bits will be ignored
|
||||
self.send_data((x >> 3) & 0xFF)
|
||||
self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER
|
||||
self.send_data(y & 0xFF)
|
||||
self.send_data((y >> 8) & 0xFF)
|
||||
self.wait_until_idle()
|
||||
|
||||
def getbuffer(self, image):
|
||||
if self.width%8 == 0:
|
||||
linewidth = self.width//8
|
||||
else:
|
||||
linewidth = self.width//8 + 1
|
||||
|
||||
buf = [0xFF] * (linewidth * self.height)
|
||||
image_monocolor = image.convert('1')
|
||||
imwidth, imheight = image_monocolor.size
|
||||
pixels = image_monocolor.load()
|
||||
|
||||
if(imwidth == self.width and imheight == self.height):
|
||||
# print("Vertical")
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
if pixels[x, y] == 0:
|
||||
# x = imwidth - x
|
||||
buf[x // 8 + y * linewidth] &= ~(0x80 >> (x % 8))
|
||||
elif(imwidth == self.height and imheight == self.width):
|
||||
# print("Horizontal")
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
newx = y
|
||||
newy = self.height - x - 1
|
||||
if pixels[x, y] == 0:
|
||||
# newy = imwidth - newy - 1
|
||||
buf[newx // 8 + newy*linewidth] &= ~(0x80 >> (y % 8))
|
||||
return buf
|
||||
|
||||
|
||||
def display(self, image):
|
||||
if self.width%8 == 0:
|
||||
linewidth = self.width//8
|
||||
else:
|
||||
linewidth = self.width//8 + 1
|
||||
|
||||
self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT);
|
||||
for j in range(0, self.height):
|
||||
self.SetCursor(0, j);
|
||||
self.send_command(0x24);
|
||||
for i in range(0, linewidth):
|
||||
self.send_data(image[i + j * linewidth])
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def Clear(self, color):
|
||||
if self.width%8 == 0:
|
||||
linewidth = self.width//8
|
||||
else:
|
||||
linewidth = self.width//8 + 1
|
||||
|
||||
self.SetWindows(0, 0, EPD_WIDTH, EPD_HEIGHT);
|
||||
for j in range(0, self.height):
|
||||
self.SetCursor(0, j);
|
||||
self.send_command(0x24);
|
||||
for i in range(0, linewidth):
|
||||
self.send_data(color)
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def sleep(self):
|
||||
self.send_command(0x10) #enter deep sleep
|
||||
# self.send_data(0x01)
|
||||
epdconfig.delay_ms(100)
|
||||
|
||||
### END OF FILE ###
|
||||
|
||||
# *****************************************************************************
|
||||
# * | File : epd2in13.py
|
||||
# * | Author : Waveshare team
|
||||
# * | Function : Electronic paper driver
|
||||
# * | Info :
|
||||
# *----------------
|
||||
# * | This version: V4.0
|
||||
# * | Date : 2019-06-20
|
||||
# # | Info : python demo
|
||||
# -----------------------------------------------------------------------------
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documnetation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
from . import epdconfig
|
||||
import numpy as np
|
||||
|
||||
# Display resolution
|
||||
EPD_WIDTH = 122
|
||||
EPD_HEIGHT = 250
|
||||
|
||||
class EPD:
|
||||
def __init__(self):
|
||||
self.reset_pin = epdconfig.RST_PIN
|
||||
self.dc_pin = epdconfig.DC_PIN
|
||||
self.busy_pin = epdconfig.BUSY_PIN
|
||||
self.cs_pin = epdconfig.CS_PIN
|
||||
self.width = EPD_WIDTH
|
||||
self.height = EPD_HEIGHT
|
||||
|
||||
lut_full_update = [
|
||||
0x22, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x11,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
]
|
||||
|
||||
lut_partial_update = [
|
||||
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
]
|
||||
|
||||
# Hardware reset
|
||||
def reset(self):
|
||||
epdconfig.digital_write(self.cs_pin, 0)
|
||||
epdconfig.digital_write(self.reset_pin, 1)
|
||||
epdconfig.delay_ms(200)
|
||||
epdconfig.digital_write(self.reset_pin, 0)
|
||||
epdconfig.delay_ms(10)
|
||||
epdconfig.digital_write(self.reset_pin, 1)
|
||||
epdconfig.delay_ms(200)
|
||||
epdconfig.digital_write(self.cs_pin, 1)
|
||||
|
||||
def send_command(self, command):
|
||||
epdconfig.digital_write(self.cs_pin, 0)
|
||||
epdconfig.digital_write(self.dc_pin, 0)
|
||||
epdconfig.spi_writebyte([command])
|
||||
epdconfig.digital_write(self.cs_pin, 1)
|
||||
|
||||
def send_data(self, data):
|
||||
epdconfig.digital_write(self.cs_pin, 0)
|
||||
epdconfig.digital_write(self.dc_pin, 1)
|
||||
epdconfig.spi_writebyte([data])
|
||||
epdconfig.digital_write(self.cs_pin, 1)
|
||||
|
||||
def ReadBusy(self):
|
||||
while(epdconfig.digital_read(self.busy_pin) == 1): # 0: idle, 1: busy
|
||||
epdconfig.delay_ms(100)
|
||||
|
||||
def TurnOnDisplay(self):
|
||||
self.send_command(0x22) # DISPLAY_UPDATE_CONTROL_2
|
||||
self.send_data(0xC4)
|
||||
self.send_command(0x20) # MASTER_ACTIVATION
|
||||
self.send_command(0xFF) # TERMINATE_FRAME_READ_WRITE
|
||||
|
||||
logging.debug("e-Paper busy")
|
||||
self.ReadBusy()
|
||||
logging.debug("e-Paper busy release")
|
||||
|
||||
def init(self, lut):
|
||||
if (epdconfig.module_init() != 0):
|
||||
return -1
|
||||
# EPD hardware init start
|
||||
self.reset()
|
||||
self.send_command(0x01) # DRIVER_OUTPUT_CONTROL
|
||||
self.send_data((EPD_HEIGHT - 1) & 0xFF)
|
||||
self.send_data(((EPD_HEIGHT - 1) >> 8) & 0xFF)
|
||||
self.send_data(0x00) # GD = 0 SM = 0 TB = 0
|
||||
|
||||
self.send_command(0x0C) # BOOSTER_SOFT_START_CONTROL
|
||||
self.send_data(0xD7)
|
||||
self.send_data(0xD6)
|
||||
self.send_data(0x9D)
|
||||
|
||||
self.send_command(0x2C) # WRITE_VCOM_REGISTER
|
||||
self.send_data(0xA8) # VCOM 7C
|
||||
|
||||
self.send_command(0x3A) # SET_DUMMY_LINE_PERIOD
|
||||
self.send_data(0x1A) # 4 dummy lines per gate
|
||||
|
||||
self.send_command(0x3B) # SET_GATE_TIME
|
||||
self.send_data(0x08) # 2us per line
|
||||
|
||||
self.send_command(0X3C) # BORDER_WAVEFORM_CONTROL
|
||||
self.send_data(0x03)
|
||||
|
||||
self.send_command(0X11) # DATA_ENTRY_MODE_SETTING
|
||||
self.send_data(0x03) # X increment; Y increment
|
||||
|
||||
# WRITE_LUT_REGISTER
|
||||
self.send_command(0x32)
|
||||
for count in range(30):
|
||||
self.send_data(lut[count])
|
||||
|
||||
return 0
|
||||
|
||||
##
|
||||
# @brief: specify the memory area for data R/W
|
||||
##
|
||||
def SetWindows(self, x_start, y_start, x_end, y_end):
|
||||
self.send_command(0x44) # SET_RAM_X_ADDRESS_START_END_POSITION
|
||||
self.send_data((x_start >> 3) & 0xFF)
|
||||
self.send_data((x_end >> 3) & 0xFF)
|
||||
self.send_command(0x45) # SET_RAM_Y_ADDRESS_START_END_POSITION
|
||||
self.send_data(y_start & 0xFF)
|
||||
self.send_data((y_start >> 8) & 0xFF)
|
||||
self.send_data(y_end & 0xFF)
|
||||
self.send_data((y_end >> 8) & 0xFF)
|
||||
|
||||
##
|
||||
# @brief: specify the start point for data R/W
|
||||
##
|
||||
def SetCursor(self, x, y):
|
||||
self.send_command(0x4E) # SET_RAM_X_ADDRESS_COUNTER
|
||||
# x point must be the multiple of 8 or the last 3 bits will be ignored
|
||||
self.send_data((x >> 3) & 0xFF)
|
||||
self.send_command(0x4F) # SET_RAM_Y_ADDRESS_COUNTER
|
||||
self.send_data(y & 0xFF)
|
||||
self.send_data((y >> 8) & 0xFF)
|
||||
self.ReadBusy()
|
||||
|
||||
def getbuffer(self, image):
|
||||
if self.width%8 == 0:
|
||||
linewidth = int(self.width/8)
|
||||
else:
|
||||
linewidth = int(self.width/8) + 1
|
||||
|
||||
buf = [0xFF] * (linewidth * self.height)
|
||||
image_monocolor = image.convert('1')
|
||||
imwidth, imheight = image_monocolor.size
|
||||
pixels = image_monocolor.load()
|
||||
|
||||
if(imwidth == self.width and imheight == self.height):
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
if pixels[x, y] == 0:
|
||||
# x = imwidth - x
|
||||
buf[int(x / 8) + y * linewidth] &= ~(0x80 >> (x % 8))
|
||||
elif(imwidth == self.height and imheight == self.width):
|
||||
for y in range(imheight):
|
||||
for x in range(imwidth):
|
||||
newx = y
|
||||
newy = self.height - x - 1
|
||||
if pixels[x, y] == 0:
|
||||
# newy = imwidth - newy - 1
|
||||
buf[int(newx / 8) + newy*linewidth] &= ~(0x80 >> (y % 8))
|
||||
return buf
|
||||
|
||||
|
||||
def display(self, image):
|
||||
if self.width%8 == 0:
|
||||
linewidth = int(self.width/8)
|
||||
else:
|
||||
linewidth = int(self.width/8) + 1
|
||||
|
||||
self.SetWindows(0, 0, self.width, self.height);
|
||||
for j in range(0, self.height):
|
||||
self.SetCursor(0, j);
|
||||
self.send_command(0x24);
|
||||
for i in range(0, linewidth):
|
||||
self.send_data(image[i + j * linewidth])
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def Clear(self, color):
|
||||
if self.width%8 == 0:
|
||||
linewidth = int(self.width/8)
|
||||
else:
|
||||
linewidth = int(self.width/8) + 1
|
||||
|
||||
self.SetWindows(0, 0, self.width, self.height);
|
||||
for j in range(0, self.height):
|
||||
self.SetCursor(0, j);
|
||||
self.send_command(0x24);
|
||||
for i in range(0, linewidth):
|
||||
self.send_data(color)
|
||||
self.TurnOnDisplay()
|
||||
|
||||
def sleep(self):
|
||||
self.send_command(0x10) #enter deep sleep
|
||||
self.send_data(0x01)
|
||||
epdconfig.delay_ms(100)
|
||||
|
||||
epdconfig.module_exit()
|
||||
|
||||
### END OF FILE ###
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
version = '1.0.0travistest'
|
@ -17,129 +17,108 @@ class Voice:
|
||||
def default(self):
|
||||
return self._('ZzzzZZzzzzZzzz')
|
||||
|
||||
|
||||
def on_starting(self):
|
||||
return random.choice([ \
|
||||
self._('Hi, I\'m Pwnagotchi!\nStarting ...'),
|
||||
self._('New day, new hunt,\nnew pwns!'),
|
||||
return random.choice([
|
||||
self._('Hi, I\'m Pwnagotchi! Starting ...'),
|
||||
self._('New day, new hunt, new pwns!'),
|
||||
self._('Hack the Planet!')])
|
||||
|
||||
|
||||
def on_ai_ready(self):
|
||||
return random.choice([
|
||||
self._('AI ready.'),
|
||||
self._('The neural network\nis ready.')])
|
||||
|
||||
self._('The neural network is ready.')])
|
||||
|
||||
def on_normal(self):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
'',
|
||||
'...'])
|
||||
|
||||
|
||||
def on_free_channel(self, channel):
|
||||
return self._('Hey, channel {channel} is\nfree! Your AP will\nsay thanks.').format(channel=channel)
|
||||
|
||||
return self._('Hey, channel {channel} is free! Your AP will say thanks.').format(channel=channel)
|
||||
|
||||
def on_bored(self):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
self._('I\'m bored ...'),
|
||||
self._('Let\'s go for a walk!')])
|
||||
|
||||
|
||||
def on_motivated(self, reward):
|
||||
return self._('This is the best\nday of my life!')
|
||||
|
||||
return self._('This is the best day of my life!')
|
||||
|
||||
def on_demotivated(self, reward):
|
||||
return self._('Shitty day :/')
|
||||
|
||||
|
||||
def on_sad(self):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
self._('I\'m extremely bored ...'),
|
||||
self._('I\'m very sad ...'),
|
||||
self._('I\'m sad'),
|
||||
'...'])
|
||||
|
||||
|
||||
def on_excited(self):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
self._('I\'m living the life!'),
|
||||
self._('I pwn therefore I am.'),
|
||||
self._('So many networks!!!'),
|
||||
self._('I\'m having so much\nfun!'),
|
||||
self._('My crime is that of\ncuriosity ...')])
|
||||
|
||||
self._('I\'m having so much fun!'),
|
||||
self._('My crime is that of curiosity ...')])
|
||||
|
||||
def on_new_peer(self, peer):
|
||||
return random.choice([ \
|
||||
self._('Hello\n{name}!\nNice to meet you. {name}').format(name=peer.name()),
|
||||
self._('Unit\n{name}\nis nearby! {name}').format(name=peer.name())])
|
||||
|
||||
return random.choice([
|
||||
self._('Hello {name}! Nice to meet you. {name}').format(name=peer.name()),
|
||||
self._('Unit {name} is nearby! {name}').format(name=peer.name())])
|
||||
|
||||
def on_lost_peer(self, peer):
|
||||
return random.choice([ \
|
||||
self._('Uhm ...\ngoodbye\n{name}').format(name=peer.name()),
|
||||
self._('{name}\nis gone ...').format(name=peer.name())])
|
||||
|
||||
return random.choice([
|
||||
self._('Uhm ... goodbye {name}').format(name=peer.name()),
|
||||
self._('{name} is gone ...').format(name=peer.name())])
|
||||
|
||||
def on_miss(self, who):
|
||||
return random.choice([ \
|
||||
self._('Whoops ...\n{name}\nis gone.').format(name=who),
|
||||
self._('{name}\nmissed!').format(name=who),
|
||||
return random.choice([
|
||||
self._('Whoops ... {name} is gone.').format(name=who),
|
||||
self._('{name} missed!').format(name=who),
|
||||
self._('Missed!')])
|
||||
|
||||
|
||||
def on_lonely(self):
|
||||
return random.choice([ \
|
||||
self._('Nobody wants to\nplay with me ...'),
|
||||
return random.choice([
|
||||
self._('Nobody wants to play with me ...'),
|
||||
self._('I feel so alone ...'),
|
||||
self._('Where\'s everybody?!')])
|
||||
|
||||
|
||||
def on_napping(self, secs):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
self._('Napping for {secs}s ...').format(secs=secs),
|
||||
self._('Zzzzz'),
|
||||
self._('ZzzZzzz ({secs}s)').format(secs=secs)])
|
||||
|
||||
|
||||
def on_awakening(self):
|
||||
return random.choice(['...', '!'])
|
||||
|
||||
|
||||
def on_waiting(self, secs):
|
||||
return random.choice([ \
|
||||
return random.choice([
|
||||
self._('Waiting for {secs}s ...').format(secs=secs),
|
||||
'...',
|
||||
self._('Looking around ({secs}s)').format(secs=secs)])
|
||||
|
||||
|
||||
def on_assoc(self, ap):
|
||||
ssid, bssid = ap['hostname'], ap['mac']
|
||||
what = ssid if ssid != '' and ssid != '<hidden>' else bssid
|
||||
return random.choice([ \
|
||||
self._('Hey\n{what}\nlet\'s be friends!').format(what=what),
|
||||
self._('Associating to\n{what}').format(what=what),
|
||||
self._('Yo\n{what}!').format(what=what)])
|
||||
|
||||
|
||||
def on_deauth(self,sta):
|
||||
return random.choice([ \
|
||||
self._('Just decided that\n{mac}\nneeds no WiFi!').format(mac=sta['mac']),
|
||||
self._('Deauthenticating\n{mac}').format(mac=sta['mac']),
|
||||
self._('Kickbanning\n{mac}!').format(mac=sta['mac'])])
|
||||
return random.choice([
|
||||
self._('Hey {what} let\'s be friends!').format(what=what),
|
||||
self._('Associating to {what}').format(what=what),
|
||||
self._('Yo {what}!').format(what=what)])
|
||||
|
||||
def on_deauth(self, sta):
|
||||
return random.choice([
|
||||
self._('Just decided that {mac} needs no WiFi!').format(mac=sta['mac']),
|
||||
self._('Deauthenticating {mac}').format(mac=sta['mac']),
|
||||
self._('Kickbanning {mac}!').format(mac=sta['mac'])])
|
||||
|
||||
def on_handshakes(self, new_shakes):
|
||||
s = 's' if new_shakes > 1 else ''
|
||||
return self._('Cool, we got {num}\nnew handshake{plural}!').format(num=new_shakes, plural=s)
|
||||
|
||||
return self._('Cool, we got {num} new handshake{plural}!').format(num=new_shakes, plural=s)
|
||||
|
||||
def on_rebooting(self):
|
||||
return self._("Ops, something\nwent wrong ...\nRebooting ...")
|
||||
|
||||
return self._("Ops, something went wrong ... Rebooting ...")
|
||||
|
||||
def on_log(self, log):
|
||||
status = self._('Kicked {num} stations\n').format(num=log.deauthed)
|
||||
@ -151,10 +130,13 @@ class Voice:
|
||||
status += self._('Met {num} peers').format(num=log.peers)
|
||||
return status
|
||||
|
||||
|
||||
def on_log_tweet(self, log):
|
||||
return self._('I\'ve been pwning for {duration} and kicked {deauthed} clients! I\'ve also met {associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet').format(
|
||||
duration=log.duration_human,
|
||||
deauthed=log.deauthed,
|
||||
associated=log.associated,
|
||||
handshakes=log.handshakes)
|
||||
return self._(
|
||||
'I\'ve been pwning for {duration} and kicked {deauthed} clients! I\'ve also met {associated} new friends and ate {handshakes} handshakes! #pwnagotchi #pwnlog #pwnlife #hacktheplanet #skynet').format(
|
||||
duration=log.duration_human,
|
||||
deauthed=log.deauthed,
|
||||
associated=log.associated,
|
||||
handshakes=log.handshakes)
|
||||
|
||||
def custom(self, text):
|
||||
return self._(text)
|
||||
|
@ -10,3 +10,4 @@ file_read_backwards
|
||||
numpy
|
||||
inky
|
||||
smbus
|
||||
pillow
|
||||
|
@ -9,5 +9,3 @@ if ifconfig | grep usb0 | grep RUNNING; then
|
||||
else
|
||||
sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto
|
||||
fi
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user