Rename "changes" to "diffs" in most places

This commit is contained in:
Joscha 2017-04-14 11:09:50 +00:00
parent 3cb21c02bc
commit d68d32ff2f
6 changed files with 82 additions and 71 deletions

View file

@ -81,23 +81,23 @@ class ChunkDiff():
return ChunkDiff.from_dict(diffs) return ChunkDiff.from_dict(diffs)
def jsonify_changes(changes): def jsonify_diffs(diffs):
dchanges = [] ddiffs = []
for chunk in changes: for dchunk in diffs:
pos = chunk[0] pos = dchunk[0]
change = chunk[1].to_dict() ddiff = dchunk[1].to_dict()
dchanges.append((pos, change)) ddiffs.append((pos, ddiff))
return dchanges return ddiffs
def dejsonify_changes(dchanges): def dejsonify_diffs(ddiffs):
changes = [] diffs = []
for chunk in dchanges: for dchunk in ddiffs:
pos = Position(chunk[0][0], chunk[0][1]) pos = Position(dchunk[0][0], dchunk[0][1])
change = ChunkDiff.from_dict(chunk[1]) diff = ChunkDiff.from_dict(dchunk[1])
changes.append((pos, change)) diffs.append((pos, diff))
return changes return diffs
class Chunk(): class Chunk():
""" """
@ -126,6 +126,9 @@ class Chunk():
self.commit_diff(self._modifications) self.commit_diff(self._modifications)
self._modifications = ChunkDiff() self._modifications = ChunkDiff()
def apply_diff(self, diff):
self._modifications.apply(diff)
def commit_diff(self, diff): def commit_diff(self, diff):
self._content.apply(diff) self._content.apply(diff)
self._content.clear_deletions() self._content.clear_deletions()
@ -184,15 +187,20 @@ class ChunkPool():
self.set(pos, chunk) self.set(pos, chunk)
return chunk return chunk
def apply_changes(self, changes): def apply_diffs(self, diffs):
for change in changes: for dchunk in diffs:
pos = change[0] pos = dchunk[0]
diff = change[1] diff = dchunk[1]
chunk = self.get(pos) chunk = self.get(pos) or self.create(pos)
if not chunk: chunk.apply_diff(diff)
chunk = self.create(pos)
def commit_diffs(self, diffs):
for dchunk in diffs:
pos = dchunk[0]
diff = dchunk[1]
chunk = self.get(pos) or self.create(pos)
chunk.commit_diff(diff) chunk.commit_diff(diff)
def commit_changes(self): def commit_changes(self):

View file

@ -8,7 +8,7 @@ import websocket
from websocket import WebSocketException as WSException from websocket import WebSocketException as WSException
from maps import Map, ChunkMap from maps import Map, ChunkMap
from chunks import ChunkDiff, jsonify_changes, dejsonify_changes from chunks import ChunkDiff, jsonify_diffs, dejsonify_diffs
from utils import Position from utils import Position
from clientchunkpool import ClientChunkPool from clientchunkpool import ClientChunkPool
@ -131,8 +131,8 @@ class Client():
def handle_json(self, message): def handle_json(self, message):
if message["type"] == "apply-changes": if message["type"] == "apply-changes":
changes = dejsonify_changes(message["data"]) diffs = dejsonify_diffs(message["data"])
self.map_.apply_changes(changes) self.map_.commit_diffs(diffs)
def stop(self): def stop(self):
self.stopping = True self.stopping = True
@ -147,9 +147,9 @@ class Client():
message = {"type": "unload-chunks", "data": coords} message = {"type": "unload-chunks", "data": coords}
self._ws.send(json.dumps(message)) self._ws.send(json.dumps(message))
def send_changes(self, changes): def send_changes(self, diffs):
changes = jsonify_changes(changes) diffs = jsonify_diffs(diffs)
message = {"type": "save-changes", "data": changes} message = {"type": "save-changes", "data": diffs}
self._ws.send(json.dumps(message)) self._ws.send(json.dumps(message))
def main(argv): def main(argv):

View file

@ -15,8 +15,8 @@ class ClientChunkPool(ChunkPool):
def set(self, pos, chunk): def set(self, pos, chunk):
super().set(pos, chunk) super().set(pos, chunk)
def apply_changes(self, changes): def commit_diffs(self, diffs):
super().apply_changes(changes) super().commit_diffs(diffs)
self._client.redraw() self._client.redraw()
@ -29,11 +29,12 @@ class ClientChunkPool(ChunkPool):
self._save_thread.start() self._save_thread.start()
def save_changes(self): def save_changes(self):
changes = self.commit_changes() diffs = self.commit_changes()
changes = [chunk for chunk in changes if not chunk[1].empty()] # filter out empty changes/chunks
diffs = [dchunk for dchunk in diffs if not dchunk[1].empty()]
if changes: if diffs:
self._client.send_changes(changes) self._client.send_changes(diffs)
def load(self, pos): def load(self, pos):
raise Exception raise Exception

View file

@ -12,4 +12,6 @@ class DBChunkPool(ChunkPool):
A ChunkPool that can load/save chunks from/to a database. A ChunkPool that can load/save chunks from/to a database.
""" """
pass #def __init__(self, filename):
#super().init()
#self._chunkdb = ChunkDB(filename)

View file

@ -210,9 +210,9 @@ class Map():
#self.load_visible() #self.load_visible()
def apply_changes(self, changes): def commit_diffs(self, diffs):
with self.chunkpool as pool: with self.chunkpool as pool:
pool.apply_changes(changes) pool.commit_diffs(diffs)
ChunkStyle = namedtuple("ChunkStyle", "string color") ChunkStyle = namedtuple("ChunkStyle", "string color")

View file

@ -5,7 +5,7 @@ import threading
from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket
from utils import Position from utils import Position
from chunks import ChunkDiff, jsonify_changes, dejsonify_changes from chunks import ChunkDiff, jsonify_diffs, dejsonify_diffs
from dbchunkpool import DBChunkPool from dbchunkpool import DBChunkPool
pool = DBChunkPool() pool = DBChunkPool()
@ -13,17 +13,17 @@ clients = []
class WotServer(WebSocket): class WotServer(WebSocket):
def handle_request_chunks(self, coords): def handle_request_chunks(self, coords):
changes = [] diffs = []
with pool: with pool:
for coor in coords: for coor in coords:
pos = Position(coor[0], coor[1]) pos = Position(coor[0], coor[1])
change = pool.get(pos) or pool.create(pos) chunk = pool.get(pos) or pool.create(pos)
changes.append((pos, change.as_diff())) diffs.append((pos, chunk.as_diff()))
self.loaded_chunks.add(pos) self.loaded_chunks.add(pos)
dchanges = jsonify_changes(changes) ddiffs = jsonify_diffs(diffs)
message = {"type": "apply-changes", "data": dchanges} message = {"type": "apply-changes", "data": ddiffs}
self.sendMessage(json.dumps(message)) self.sendMessage(json.dumps(message))
def handle_unload_chunks(self, coords): def handle_unload_chunks(self, coords):
@ -32,51 +32,51 @@ class WotServer(WebSocket):
if pos in self.loaded_chunks: if pos in self.loaded_chunks:
self.loaded_chunks.remove(pos) self.loaded_chunks.remove(pos)
def handle_save_changes(self, dchanges): def handle_save_changes(self, ddiffs):
changes = dejsonify_changes(dchanges) diffs = dejsonify_diffs(ddiffs)
# check whether changes are correct (exclude certain characters) # check whether changes are correct (exclude certain characters)
# if not correct, send corrections them back to sender # if not correct, send corrections them back to sender
legitimate_changes = [] legitimate_diffs = []
illegitimate_changes = [] illegitimate_diffs = []
for chunk in changes: for dchunk in diffs:
if chunk[1].legitimate(): if dchunk[1].legitimate():
legitimate_changes.append(chunk) legitimate_diffs.append(dchunk)
else: else:
illegitimate_changes.append(chunk) illegitimate_diffs.append(dchunk)
if legitimate_changes: if legitimate_diffs:
with pool: with pool:
pool.apply_changes(legitimate_changes) pool.apply_diffs(legitimate_diffs)
for client in clients: for client in clients:
if client: if client:
client.send_changes(legitimate_changes) client.send_changes(legitimate_diffs)
if illegitimate_changes: if illegitimate_diffs:
reverse_changes = self.reverse_changes(changes) reverse_diffs = self.reverse_diffs(illegitimate_diffs)
reverse_dchanges = jsonify_changes(reverse_changes) reverse_ddiffs = jsonify_diffs(reverse_diffs)
message = {"type": "apply-changes", "data": reverse_dchanges} message = {"type": "apply-changes", "data": reverse_ddiffs}
self.sendMessage(json.dumps(message)) self.sendMessage(json.dumps(message))
def reverse_changes(self, changes): def reverse_diffs(self, diffs):
with pool: with pool:
reverse_changes = [] reverse_diffs = []
for chunk in changes: for dchunk in diffs:
pos = chunk[0] pos = dchunk[0]
change = chunk[1] diff = dchunk[1]
real_chunk = pool.get(pos) or pool.create(pos) chunk = pool.get(pos) or pool.create(pos)
reverse_change = change.diff(real_chunk.as_diff()) reverse_diff = diff.diff(chunk.as_diff())
reverse_changes.append((pos, reverse_change)) reverse_diffs.append((pos, reverse_diff))
return reverse_changes return reverse_diffs
def send_changes(self, changes): def send_changes(self, diffs):
changes = [chunk for chunk in changes if chunk[0] in self.loaded_chunks] diffs = [dchunk for dchunk in diffs if dchunk[0] in self.loaded_chunks]
dchanges = jsonify_changes(changes) ddiffs = jsonify_diffs(diffs)
if dchanges: if ddiffs:
message = {"type": "apply-changes", "data": dchanges} message = {"type": "apply-changes", "data": ddiffs}
self.sendMessage(json.dumps(message)) self.sendMessage(json.dumps(message))
def handleMessage(self): def handleMessage(self):