require 'json' # this class converts the direct messages from a slack export to # a format wich can then be imported by mattermost # author Daniel Schubert class ImportDMS def initialize() @dms = {} @users = {} self.xtract_users self.xtract_dms end def xtract_users() data = self.read_json('users.json') data.each do |d| @users.store( d["id"], d["name"]) end end def xtract_dms() data = self.read_json('dms.json') data.each do |d| @dms.store( d["id"],d["members"]) end end def read_json( file ) f = File.open file d = JSON.load f end def get_usr_name( id ) unless (id == nil) @users.fetch(id) end end def cnvrt_ts( ts ) # converts the slack timestamp to a mattermost timestamp t = ts.sub!(".", "") t[0,13] end def get_messages(chat_id) files = Dir.glob("#{chat_id}/*.json") chats = Array.new files.each { |file| f = read_json( file ) f.each { |m| n = self.get_usr_name( m["user"] ) ts = self.cnvrt_ts( m["ts"] ) #user,ts, test chats.push( [ts, n, m["text"]] ) } } return chats end def create_json # version; required puts '{"type":"version","version":1}' @dms.each_key do |key| #get user names user_names = [] @dms.fetch(key).each do |u_id| user_names.push( @users.fetch(u_id) ) end self.create_channel_list self.create_direct_messages end end def create_direct_messages #TODO : replies are output as normal messages; should be grouped as replies # create direct messages list m = get_messages(key) m.each do |msg| ml = {"type"=>"direct_post","direct_post"=>{"channel_members" => user_names, "user" => msg[1], "message" => msg[2], "create_at" => msg[0].to_i, "flagged_by" => nil, "reactions" => nil, "replies"=> nil, "attachments"=> nil } }.to_json puts ml end end def create_channel_list cl = {"type" => "direct_channel", "direct_channel" => {"members" => user_names, "favorited_by" => nil,"header" => "" }}.to_json puts cl end end # usage i = ImportDMS.new i.create_json