Skip to content

Commit

Permalink
minor bug fixes and code cleanup. 0.14.0-alpha.2
Browse files Browse the repository at this point in the history
  • Loading branch information
doorbash committed Sep 23, 2020
1 parent bd2be31 commit 3ee760a
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 76 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Implementation of Colyseus client using Kotlin

```groovy
dependencies {
implementation 'io.github.doorbash:colyseus-kotlin:0.14.0-alpha.1'
implementation 'io.github.doorbash:colyseus-kotlin:0.14.0-alpha.2'
}
```

Expand Down Expand Up @@ -114,19 +114,19 @@ onStateChange = { state, isFirstState ->

/* Schema listeners */
state.primitives.onChange = { changes ->
for (change in changes!!) {
for (change in changes) {
with(change!!) {
println("$Field: $PreviousValue -> $Value")
println("$field: $previousValue -> $value")
}
}
}

state.players.onAdd = { player: Player?, key: Int? ->
println("player added: " + key + " " + player?.x)
state.players.onAdd = { player: Player, key: Int ->
println("player added: " + key + " " + player.x)
}

state.players.onRemove = { player: Player?, key: Int? ->
println("player removed: " + key + " " + player?.x)
state.players.onRemove = { player: Player, key: Int ->
println("player removed: " + key + " " + player.x)
}

/* Message Listeners */
Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ apply plugin: 'com.novoda.bintray-release'
apply plugin: 'kotlin'

group 'io.github.doorbash'
version '0.14.0-alpha.1'
version '0.14.0-alpha.2'

repositories {
mavenCentral()
Expand All @@ -38,7 +38,7 @@ dependencies {
publish {
def groupProjectID = 'io.github.doorbash'
def artifactProjectID = 'colyseus-kotlin'
def publishVersionID = '0.14.0-alpha.1'
def publishVersionID = '0.14.0-alpha.2'
userOrg = 'doorbash'
repoName = 'io.github.doorbash'
groupId = groupProjectID
Expand Down
81 changes: 40 additions & 41 deletions src/main/java/io/colyseus/serializer/schema/Schema.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,13 @@ public enum class OPERATION(val value: Int) {
}

class DataChange(
var Op: Int = 0,
var Field: String? = null,
var DynamicIndex: Any? = null,
var Value: Any? = null,
var PreviousValue: Any? = null,
var op: Int = 0,
var field: String? = null,
var dynamicIndex: Any? = null,
var value: Any? = null,
var previousValue: Any? = null,
)

// public delegate void OnChangeEventHandler(List<DataChange> changes)
// public delegate void KeyValueEventHandler<T, K>(T value, K key)
// public delegate void OnRemoveEventHandler()

public interface ISchemaCollection {
fun moveEventHandlers(previousInstance: ISchemaCollection)
fun invokeOnAdd(item: Any, index: Any)
Expand Down Expand Up @@ -109,7 +105,7 @@ open class Schema : IRef {
val fieldChildTypes = HashMap<String, Class<*>?>()

@JsonIgnore
var onChange: ((changes: List<DataChange?>?) -> Unit)? = null
var onChange: ((changes: List<DataChange?>) -> Unit)? = null

@JsonIgnore
var onRemove: (() -> Unit)? = null
Expand Down Expand Up @@ -194,7 +190,8 @@ open class Schema : IRef {
// Trying to access a reference that haven't been decoded yet.
//
if (_ref == null) {
throw Exception("refId not found: $refId") }
throw Exception("refId not found: $refId")
}

// create empty list of changes for this refId.
changes = arrayListOf()
Expand Down Expand Up @@ -360,10 +357,10 @@ open class Schema : IRef {

for (key in keys) {
deletes.add(DataChange(
DynamicIndex = key,
Op = OPERATION.DELETE.value,
Value = null,
PreviousValue = previousValue._get(key)
dynamicIndex = key,
op = OPERATION.DELETE.value,
value = null,
previousValue = previousValue._get(key)
))
}

Expand Down Expand Up @@ -392,11 +389,11 @@ open class Schema : IRef {

if (hasChange) {
changes.add(DataChange(
Op = operation,
Field = fieldName,
DynamicIndex = dynamicIndex,
Value = value,
PreviousValue = previousValue
op = operation,
field = fieldName,
dynamicIndex = dynamicIndex,
value = value,
previousValue = previousValue
))
}
}
Expand All @@ -417,7 +414,8 @@ open class Schema : IRef {
protected fun triggerAllFillChanges(currentRef: IRef, allChanges: HashMap<Any, Any>) {
// skip recursive structures...
if (allChanges.contains(currentRef.__refId)) {
return }
return
}

var changes = arrayListOf<DataChange>()
allChanges[currentRef.__refId as Any] = changes
Expand All @@ -426,9 +424,9 @@ open class Schema : IRef {
for (fieldName in currentRef.fieldsByIndex.values) {
val value = currentRef[fieldName!!]
changes.add(DataChange(
Field = fieldName,
Op = OPERATION.ADD.value,
Value = value
field = fieldName,
op = OPERATION.ADD.value,
value = value
))

if (value is IRef) {
Expand All @@ -443,10 +441,10 @@ open class Schema : IRef {

changes.add(DataChange
(
Field = null,
DynamicIndex = key,
Op = OPERATION.ADD.value,
Value = child
field = null,
dynamicIndex = key,
op = OPERATION.ADD.value,
value = child
))

triggerAllFillChanges(child as IRef, allChanges)
Expand All @@ -468,33 +466,34 @@ open class Schema : IRef {
if (!isSchema) {
val container = _ref as ISchemaCollection

if (change.Op == OPERATION.ADD.value && change.PreviousValue == container.getTypeDefaultValue()) {
container.invokeOnAdd(change.Value!!, change.DynamicIndex!!)
if (change.op == OPERATION.ADD.value && change.previousValue == container.getTypeDefaultValue()) {
container.invokeOnAdd(change.value!!, change.dynamicIndex!!)

} else if (change.Op == OPERATION.DELETE.value) {
} else if (change.op == OPERATION.DELETE.value) {
//
// FIXME: `previousValue` should always be avaiiable.
// ADD + DELETE operations are still encoding DELETE operation.
//
if (change.PreviousValue != container.getTypeDefaultValue()) {
container.invokeOnRemove(change.PreviousValue!!, change.DynamicIndex ?: change.Field!!)
if (change.previousValue != container.getTypeDefaultValue()) {
container.invokeOnRemove(change.previousValue!!, change.dynamicIndex
?: change.field!!)
}
} else if (change.Op == OPERATION.DELETE_AND_ADD.value) {
if (change.PreviousValue != container.getTypeDefaultValue()) {
container.invokeOnRemove(change.PreviousValue!!, change.DynamicIndex!!)
} else if (change.op == OPERATION.DELETE_AND_ADD.value) {
if (change.previousValue != container.getTypeDefaultValue()) {
container.invokeOnRemove(change.previousValue!!, change.dynamicIndex!!)
}
container.invokeOnAdd(change.Value!!, change.DynamicIndex!!)
container.invokeOnAdd(change.value!!, change.dynamicIndex!!)

} else if (change.Op == OPERATION.REPLACE.value || change.Value != change.PreviousValue) {
container.invokeOnChange(change.Value!!, change.DynamicIndex!!)
} else if (change.op == OPERATION.REPLACE.value || change.value != change.previousValue) {
container.invokeOnChange(change.value!!, change.dynamicIndex!!)
}
}

//
// trigger onRemove on child structure.
//
if ((change.Op and OPERATION.DELETE.value) == OPERATION.DELETE.value && change.PreviousValue is Schema) {
(change.PreviousValue as Schema).onRemove?.invoke()
if ((change.op and OPERATION.DELETE.value) == OPERATION.DELETE.value && change.previousValue is Schema) {
(change.previousValue as Schema).onRemove?.invoke()
}
}

Expand Down
19 changes: 10 additions & 9 deletions src/main/java/io/colyseus/serializer/schema/types/ArraySchema.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ class ArraySchema<T : Any?>(
constructor() : this(null)

@JsonIgnore
var onAdd: ((value: T?, key: Int?) -> Unit)? = null
var onAdd: ((value: T, key: Int) -> Unit)? = null

@JsonIgnore
var onChange: ((value: T?, key: Int?) -> Unit)? = null
var onChange: ((value: T, key: Int) -> Unit)? = null

@JsonIgnore
var onRemove: ((value: T?, key: Int?) -> Unit)? = null
var onRemove: ((value: T, key: Int) -> Unit)? = null

public override fun hasSchemaChild(): Boolean = (Schema::class.java).isAssignableFrom(ct)

Expand All @@ -36,7 +36,7 @@ class ArraySchema<T : Any?>(
}

public override fun setByIndex(index: Int, dynamicIndex: Any, value: Any?) {
var ind = dynamicIndex as Int
val ind = dynamicIndex as Int

if (ind < 0) return

Expand Down Expand Up @@ -114,25 +114,26 @@ class ArraySchema<T : Any?>(
return
}
for (i in 0 until size) {
onAdd?.invoke(this[i], i)
if (this[i] == null) continue
onAdd?.invoke(this[i]!!, i)
}
}

public override fun moveEventHandlers(previousInstance: ISchemaCollection) {
onAdd = (previousInstance as ArraySchema<T>).onAdd
onAdd = (previousInstance as ArraySchema<T?>).onAdd
onChange = previousInstance.onChange
onRemove = previousInstance.onRemove
}

override fun invokeOnAdd(item: Any, index: Any) {
onAdd?.invoke(item as T?, index as Int)
onAdd?.invoke(item as T, index as Int)
}

override fun invokeOnChange(item: Any, index: Any) {
onChange?.invoke(item as T?, index as Int)
onChange?.invoke(item as T, index as Int)
}

override fun invokeOnRemove(item: Any, index: Any) {
onRemove?.invoke(item as T?, index as Int)
onRemove?.invoke(item as T, index as Int)
}
}
36 changes: 19 additions & 17 deletions src/main/java/io/colyseus/serializer/schema/types/MapSchema.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,20 @@ import kotlin.collections.set

class MapSchema<T : Any?>(
@JsonIgnore public var ct: Class<T>?,
) : LinkedHashMap<String?, T?>(), ISchemaCollection, IRef {
) : LinkedHashMap<String, T?>(), ISchemaCollection, IRef {

constructor() : this(null)

@JsonIgnore
public var onAdd: ((value: T?, key: String) -> Unit)? = null
public var onAdd: ((value: T, key: String) -> Unit)? = null

@JsonIgnore
public var onChange: ((value: T?, key: String) -> Unit)? = null
public var onChange: ((value: T, key: String) -> Unit)? = null

@JsonIgnore
public var onRemove: ((value: T?, key: String) -> Unit)? = null
public var onRemove: ((value: T, key: String) -> Unit)? = null

var Indexes = HashMap<Int, String>()
var indexes = HashMap<Int, String>()

public override var __refId: Int = 0
public override var __parent: IRef? = null
Expand All @@ -37,21 +37,21 @@ class MapSchema<T : Any?>(
val dynamicIndex: String? = getIndex(index) as String?
if (contains(dynamicIndex)) {
remove(dynamicIndex)
Indexes.remove(index)
indexes.remove(index)
}
}

public override fun setIndex(index: Int, dynamicIndex: Any) {
Indexes[index] = dynamicIndex as String
indexes[index] = dynamicIndex as String
}

public override fun setByIndex(index: Int, dynamicIndex: Any, value: Any?) {
Indexes[index] = dynamicIndex as String
indexes[index] = dynamicIndex as String
this[dynamicIndex] = value as T?
}

public override fun getIndex(index: Int): Any? {
return Indexes[index]
return indexes[index]
}

public override fun _clone(): ISchemaCollection {
Expand Down Expand Up @@ -97,11 +97,12 @@ class MapSchema<T : Any?>(
public override fun _clear(refs: ReferenceTracker?) {
if (refs != null && hasSchemaChild()) {
for (item in values) {
refs.remove((item as IRef).__refId!!)
if (item == null) continue
refs.remove((item as IRef).__refId)
}
}

Indexes.clear()
indexes.clear()
clear()
}

Expand All @@ -110,7 +111,7 @@ class MapSchema<T : Any?>(
}

public fun _remove(item: Pair<String, T>): Boolean {
var value: T? = this[item.first]
val value: T? = this[item.first]
if (value != null && value.equals(item.second)) {
remove(item.first)
return true
Expand Down Expand Up @@ -138,25 +139,26 @@ class MapSchema<T : Any?>(
public override fun triggerAll() {
if (onAdd == null) return
for (item in this) {
onAdd?.invoke(item.value as T?, item.key as String)
if (item.value == null) continue
onAdd?.invoke(item.value as T, item.key)
}
}

public override fun moveEventHandlers(previousInstance: ISchemaCollection) {
onAdd = (previousInstance as (MapSchema<T>)).onAdd
onAdd = (previousInstance as (MapSchema<T?>)).onAdd
onChange = (previousInstance).onChange
onRemove = (previousInstance).onRemove
}

public override fun invokeOnAdd(item: Any, index: Any) {
onAdd?.invoke(item as T?, index as String)
onAdd?.invoke(item as T, index as String)
}

public override fun invokeOnChange(item: Any, index: Any) {
onChange?.invoke(item as T?, index as String)
onChange?.invoke(item as T, index as String)
}

public override fun invokeOnRemove(item: Any, index: Any) {
onRemove?.invoke(item as T?, index as String)
onRemove?.invoke(item as T, index as String)
}
}

0 comments on commit 3ee760a

Please sign in to comment.