Merge pull request #1 from evilsocket/master

Resync with master
This commit is contained in:
Michael Swisher
2019-10-03 04:41:07 -07:00
committed by GitHub
51 changed files with 2763 additions and 1543 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,7 +1,5 @@
import subprocess
version = '1.0.0a'
_name = None

View File

@ -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()

View File

@ -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]

View File

@ -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)

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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()))

View File

@ -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):

View File

@ -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):

View File

@ -15,3 +15,4 @@ LONELY = '(ب__ب)'
SAD = '(╥☁╥ )'
FRIEND = '(♥‿‿♥)'
BROKEN = '(☓‿‿☓)'
DEBUG = '(#__#)'

View File

@ -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)

View File

@ -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()

View File

@ -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 ###

View File

@ -0,0 +1 @@
version = '1.0.0travistest'

View File

@ -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)

View File

@ -10,3 +10,4 @@ file_read_backwards
numpy
inky
smbus
pillow

View File

@ -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