Skip to content
This repository was archived by the owner on Jun 11, 2023. It is now read-only.

Commit 6e63611

Browse files
committed
Add handlers for LogForgeProcessedEvent
1 parent f4751b1 commit 6e63611

14 files changed

Lines changed: 223 additions & 189 deletions

File tree

lib/balance/software.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@ balance Software do
2929
|> mul(modules.overflow.version)
3030

3131
bruteforce + overflow
32+
# |> float_div(2)
3233
end
3334
end

lib/event/dispatcher.ex

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,10 @@ defmodule Helix.Event.Dispatcher do
144144
##############################################################################
145145

146146
# All
147+
event LogEvent.Forge.Processed
147148
event LogEvent.Log.Created
148149
event LogEvent.Log.Deleted
149-
# event LogEvent.Log.Modified
150+
event LogEvent.Log.Revised
150151

151152
##############################################################################
152153
# Process events
@@ -209,8 +210,6 @@ defmodule Helix.Event.Dispatcher do
209210
event SoftwareEvent.File.Transfer.Processed
210211
event SoftwareEvent.Firewall.Started
211212
event SoftwareEvent.Firewall.Stopped
212-
event SoftwareEvent.LogForge.LogCreate.Processed
213-
event SoftwareEvent.LogForge.LogEdit.Processed
214213
event SoftwareEvent.Virus.Collect.Processed
215214
event SoftwareEvent.Virus.Collected
216215
event SoftwareEvent.Virus.Installed
@@ -249,14 +248,6 @@ defmodule Helix.Event.Dispatcher do
249248
ProcessHandler.Cracker,
250249
:firewall_stopped
251250

252-
event SoftwareEvent.LogForge.LogCreate.Processed,
253-
LogHandler.Log,
254-
:log_forge_conclusion
255-
256-
event SoftwareEvent.LogForge.LogEdit.Processed,
257-
LogHandler.Log,
258-
:log_forge_conclusion
259-
260251
event SoftwareEvent.Virus.Collect.Processed,
261252
SoftwareHandler.Virus,
262253
:handle_collect

lib/event/loggable/flow.ex

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,9 @@ defmodule Helix.Event.Loggable.Flow do
322322
{_, _, ip_next} = bounce_map[idx + 1]
323323

324324
data = %{ip_prev: ip_prev, ip_next: ip_next, network_id: network_id}
325-
# TODO
326-
log_type = {:connection_bounced, LogType.new(:connection_bounced, data)}
325+
log_info = {:connection_bounced, LogType.new(:connection_bounced, data)}
327326

328-
entry = build_entry(server_id, entity_id, log_type)
327+
entry = build_entry(server_id, entity_id, log_info)
329328

330329
{idx + 1, acc ++ [entry]}
331330
end

lib/event/loggable/utils.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ defmodule Helix.Event.Loggable.Utils do
3939
end
4040
end)
4141
|> elem(0)
42-
|> Enum.reverse
42+
|> Enum.reverse()
4343
|> List.to_string()
4444
end
4545

lib/id/domain.ex

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ defmodule Helix.ID.Domain do
2626
crc_bruteforce: 23
2727
crc_overflow: 33
2828
install_virus: 43
29-
log_forger: 53
30-
virus_collect: 63
31-
wire_transfer: 73
32-
bank_reveal_pass: 83
29+
virus_collect: 53
30+
wire_transfer: 63
31+
bank_reveal_pass: 73
32+
log_forge: 83
3333
reserved_until: F3
3434
reserved_until: F4
3535
@@ -154,10 +154,11 @@ defmodule Helix.ID.Domain do
154154
{{:process, :cracker_bruteforce}, 0x23},
155155
{{:process, :cracker_overflow}, 0x33},
156156
{{:process, :install_virus}, 0x43},
157-
{{:process, :log_forger}, 0x53},
158-
{{:process, :virus_collect}, 0x63},
159-
{{:process, :wire_transfer}, 0x73},
160-
{{:process, :bank_reveal_password}, 0x83},
157+
{{:process, :virus_collect}, 0x53},
158+
{{:process, :wire_transfer}, 0x63},
159+
{{:process, :bank_reveal_password}, 0x73},
160+
{{:process, :log_forge_create}, 0x83},
161+
{{:process, :log_forge_edit}, 0x83},
161162
{{:server, :desktop}, 0x05},
162163
{{:server, :mobile}, 0x15},
163164
{{:server, :npc}, 0x25},

lib/log/action/log.ex

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,4 @@
11
defmodule Helix.Log.Action.Log do
2-
@moduledoc """
3-
Functions to work with in-game logs.
4-
5-
An in-game log is a record registering an action done by an entity on a
6-
server.
7-
8-
It can be forged and recovered to a previous state.
9-
10-
Its forging mechanics is implemented as an stack where the last revision is
11-
the currently displayed message and to see the original log all revisions must
12-
be recovered.
13-
14-
Note that on Log context _forging_ and _revising_ are used interchangeably and
15-
means changing the current message of a log by adding a (forged) revision to
16-
it's stack.
17-
"""
182

193
alias Helix.Entity.Model.Entity
204
alias Helix.Server.Model.Server
@@ -23,13 +7,16 @@ defmodule Helix.Log.Action.Log do
237

248
alias Helix.Log.Event.Log.Created, as: LogCreatedEvent
259
alias Helix.Log.Event.Log.Deleted, as: LogDeletedEvent
26-
alias Helix.Log.Event.Log.Modified, as: LogModifiedEvent
10+
alias Helix.Log.Event.Log.Revised, as: LogRevisedEvent
2711

2812
@spec create(Server.id, Entity.id, Log.info, pos_integer | nil) ::
2913
{:ok, Log.t, [LogCreatedEvent.t]}
3014
| :error
3115
@doc """
3216
Creates a new log linked to `entity` on `server` with `log_info` as content.
17+
18+
This log may be natural (created automatically by the game as a result to a
19+
player's action) or artificial (explicitly created using LogForger.Edit).
3320
"""
3421
def create(server_id, entity_id, log_info, forge_version \\ nil) do
3522
case LogInternal.create(server_id, entity_id, log_info, forge_version) do

lib/log/event/handler/log.ex

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ defmodule Helix.Log.Event.Handler.Log do
22
@moduledoc false
33

44
alias Helix.Event
5-
alias Helix.Log.Action.Log, as: LogAction
65
alias Helix.Event.Loggable
6+
alias Helix.Log.Action.Log, as: LogAction
7+
alias Helix.Log.Model.Log
78
alias Helix.Log.Query.Log, as: LogQuery
89

9-
alias Helix.Software.Event.LogForge.LogCreate.Processed,
10-
as: LogForgeCreateComplete
11-
alias Helix.Software.Event.LogForge.LogEdit.Processed,
12-
as: LogForgeEditComplete
10+
alias Helix.Log.Event.Forge.Processed, as: LogForgeProcessedEvent
1311

1412
@doc """
1513
Generic event handler for all Helix events. If the event implement the
@@ -28,24 +26,36 @@ defmodule Helix.Log.Event.Handler.Log do
2826
end
2927

3028
@doc """
31-
Forges a revision onto a log or creates a fake new log
32-
"""
33-
def log_forge_conclusion(event = %LogForgeEditComplete{}) do
34-
{:ok, _, events} =
35-
event.target_log_id
36-
|> LogQuery.fetch()
37-
|> LogAction.revise(event.entity_id, event.message, event.version)
29+
Handler called right after a `LogForgeProcess` has completed. It will then
30+
either create a new log out of thin air, or edit an existing log.
3831
39-
Event.emit(events, from: event)
32+
Emits: `LogCreatedEvent`, `LogRevisedEvent`
33+
"""
34+
def log_forge_processed(event = %LogForgeProcessedEvent{action: :create}) do
35+
# `action` is `:create`, so we'll create a new log out of thin air!
36+
result =
37+
LogAction.create(
38+
event.server_id, event.entity_id, event.log_info, event.forger_version
39+
)
40+
41+
with {:ok, _, events} <- result do
42+
Event.emit(events)
43+
end
4044
end
4145

42-
def log_forge_conclusion(event = %LogForgeCreateComplete{}) do
43-
{:ok, _, events} = LogAction.create(
44-
event.target_id,
45-
event.entity_id,
46-
event.message,
47-
event.version)
46+
def log_forge_processed(event = %LogForgeProcessedEvent{action: :edit}) do
47+
# `action` is `:edit`, so we'll stack up a revision on an existing log
48+
revise = fn log ->
49+
LogAction.revise(
50+
log, event.entity_id, event.log_info, event.forger_version
51+
)
52+
end
4853

49-
Event.emit(events, from: event)
54+
with \
55+
log = %Log{} <- LogQuery.fetch(event.target_log_id),
56+
{:ok, _, events} <- revise.(log)
57+
do
58+
Event.emit(events)
59+
end
5060
end
5161
end

lib/log/event/log.ex

Lines changed: 44 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,27 @@ defmodule Helix.Log.Event.Log do
55
event Created do
66
@moduledoc """
77
LogCreatedEvent is fired when a brand new log entry is added to the server.
8+
9+
The newly created log may be either natural (automatically created by the
10+
game) or artificial (explicitly created by the player through LogForge
11+
mechanics). Either way, the receiving end of the event (Client) DOES NOT
12+
know whether the log is natural or artificial.
813
"""
914

10-
alias Helix.Server.Model.Server
1115
alias Helix.Log.Model.Log
1216

1317
@type t ::
1418
%__MODULE__{
15-
log: Log.t,
16-
server_id: Server.id
19+
log: Log.t
1720
}
1821

19-
event_struct [:server_id, :log]
22+
event_struct [:log]
2023

2124
@spec new(Log.t) ::
2225
t
2326
def new(log = %Log{}) do
2427
%__MODULE__{
25-
log: log,
26-
server_id: log.server_id
28+
log: log
2729
}
2830
end
2931

@@ -40,83 +42,72 @@ defmodule Helix.Log.Event.Log do
4042
end
4143

4244
def whom_to_publish(event),
43-
do: %{server: event.server_id}
45+
do: %{server: event.log.server_id}
4446
end
4547
end
4648

47-
# event Modified do
48-
# @moduledoc """
49-
# LogModifiedEvent is fired when an existing log has changed (revised) or
50-
# has been recovered.
49+
event Revised do
50+
@moduledoc """
51+
`LogRevisedEvent` is fired when an existing log had a revision added to it.
5152
52-
# TODO: we'll probably want to create a LogRecovered event instead.
53-
# """
53+
The revision may be stacked up on a natural or artificial log - the log
54+
origin is transparent to the Client.
55+
"""
5456

55-
# alias Helix.Server.Model.Server
56-
# alias Helix.Log.Model.Log
57+
alias Helix.Log.Model.Log
5758

58-
# @type t ::
59-
# %__MODULE__{
60-
# log: Log.t,
61-
# server_id: Server.id
62-
# }
59+
event_struct [:log]
6360

64-
# event_struct [:server_id, :log]
61+
@type t ::
62+
%__MODULE__{
63+
log: Log.t
64+
}
6565

66-
# @spec new(Log.t) ::
67-
# t
68-
# def new(log = %Log{}) do
69-
# %__MODULE__{
70-
# log: log,
71-
# server_id: log.server_id
72-
# }
73-
# end
66+
@spec new(Log.t) ::
67+
t
68+
def new(log = %Log{}) do
69+
%__MODULE__{
70+
log: log
71+
}
72+
end
7473

75-
# publish do
74+
publish do
7675

77-
# alias HELL.ClientUtils
76+
alias Helix.Log.Public.Index, as: LogIndex
7877

79-
# @event :log_modified
78+
@event :log_revised
8079

81-
# def generate_payload(event, _socket) do
82-
# data = %{
83-
# log_id: to_string(event.log.log_id),
84-
# server_id: to_string(event.server_id),
85-
# timestamp: ClientUtils.to_timestamp(event.log.creation_time),
86-
# message: event.log.message
87-
# }
80+
def generate_payload(event, _socket) do
81+
data = LogIndex.render_log(event.log)
8882

89-
# {:ok, data}
90-
# end
83+
{:ok, data}
84+
end
9185

92-
# def whom_to_publish(event),
93-
# do: %{server: event.server_id}
94-
# end
95-
# end
86+
def whom_to_publish(event),
87+
do: %{server: event.log.server_id}
88+
end
89+
end
9690

9791
event Deleted do
9892
@moduledoc """
9993
LogDeletedEvent is fired when a forged log is recovered beyond its original
10094
revision, leading to the log deletion.
10195
"""
10296

103-
alias Helix.Server.Model.Server
10497
alias Helix.Log.Model.Log
10598

10699
@type t ::
107100
%__MODULE__{
108-
log: Log.t,
109-
server_id: Server.id
101+
log: Log.t
110102
}
111103

112-
event_struct [:server_id, :log]
104+
event_struct [:log]
113105

114106
@spec new(Log.t) ::
115107
t
116108
def new(log = %Log{}) do
117109
%__MODULE__{
118-
log: log,
119-
server_id: log.server_id
110+
log: log
120111
}
121112
end
122113

@@ -126,15 +117,14 @@ defmodule Helix.Log.Event.Log do
126117

127118
def generate_payload(event, _socket) do
128119
data = %{
129-
log_id: to_string(event.log.log_id),
130-
server_id: to_string(event.server_id)
120+
log_id: to_string(event.log.log_id)
131121
}
132122

133123
{:ok, data}
134124
end
135125

136126
def whom_to_publish(event),
137-
do: %{server: event.server_id}
127+
do: %{server: event.log.server_id}
138128
end
139129
end
140130
end

lib/log/process/recover.ex

Whitespace-only changes.

lib/software/model/file/module.ex

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ defmodule Helix.Software.Model.File.Module do
1414
use Ecto.Schema
1515

1616
import Ecto.Changeset
17+
import HELL.Ecto.Macros
1718

1819
alias Ecto.Changeset
1920
alias HELL.Constant
@@ -129,11 +130,8 @@ defmodule Helix.Software.Model.File.Module do
129130
end
130131
end
131132

132-
defmodule Query do
133+
query do
133134

134-
import Ecto.Query
135-
136-
alias Ecto.Queryable
137135
alias HELL.Constant
138136
alias Helix.Software.Model.File
139137

0 commit comments

Comments
 (0)